Мой сценарий посвящен разработке математических задач. Как интерфейс IProblem
, я думал, что два основных свойства, которые он должен содержать, - это QuestionText
и Response
. QuestionText
всегда будет строка, но Response
иногда может быть сложный объект (пользовательский Fraction
STRUC) или другой тип данных, как строки, десятичной, междунар и т.д.Как инкапсулировать свойство в базовом классе?
public interface IProblem
{
string QuestionText { get; set; }
object Response { get; }
bool IsComplete();
bool IsCorrect();
}
Как вы можете видеть, Response
является объектом. Я догадался, что этот тип данных, потому что все проблемы по природе имеют ответ. И поскольку это объект, я определяю, как получить только будущие ошибки (проблемы с литьем).
Моя идея позже, в конкретном классе для доступа к этому объекту (Response
), без необходимости бросать. Проверьте это?
public abstract class Problem : IProblem
{
public string QuestionText { get; set;}
public object Response { get; protected set; }
public virtual bool IsComplete()
{
return true;
}
public abstract bool IsCorrect();
}
public class BinaryProblem : Problem
{
public decimal N1 { get; set; }
public decimal N2 { get; set; }
public decimal Response
{
get { return (decimal)base.Response; }
set { base.Response = value; }
}
public override bool IsCorrect()
{
return N1 + N2 == Response;
}
}
И здесь я проверяю значение.
static void Main(string[] args)
{
BinaryProblem p = new BinaryProblem();
p.N1 = 2;
p.N2 = 4;
p.Response = 6;
IProblem p2 = p;
Console.WriteLine(p2.Response);
Console.WriteLine(p2.IsComplete().ToString());
}
До сих пор это работает, но я хочу знать, правильно ли я выполняю то, что я делаю, или хорошая практика. Я видел, как другие люди используют new
оператора для этого. Другие не используют слово base
.
Это хороший способ? Может ли это быть причиной будущих ошибок? Пожалуйста, дайте мне отзыв о моем дизайне.
РЕДАКТИРОВАТЬ: действительно необходимо получить доступ к ответу в не-универсальном интерфейсе.
Лично я использовал бы либо Generics, либо интерфейс IResponse по объекту. Используя объект, Response может буквально быть чем угодно, включая StringBuilder и Int32 или даже WebRequest. Используя интерфейс или Generics, вы будете иметь гораздо более жесткий контроль над тем, как выполняются ответы. – ctorx
Да, и; «Ответ» всегда является числовым значением?Если это тогда, то просто используйте наиболее подходящий численный тип, т. Е. 'Double' или' decimal', в зависимости от того, что подходит. –
Согласитесь с @ctorx, Generics решит проблему намного чище, в то время как мне нравится скрывать методы/свойства класса, в этом случае вам нужно будет иметь имя diff для каждого типа результата и только показать результат, который вы хотите для типа интерфейс –