我的场景是关于开发数学问题。作为一个IProblem
接口,我认为它应该包含的两个主要属性是QuestionText
和Response
。QuestionText
始终是字符串,但Response
有时可以是复杂对象(自定义Fraction
结构)或其他数据类型,如字符串、十进制、整数等。
public interface IProblem
{
string QuestionText { get; set; }
object Response { get; }
bool IsComplete();
bool IsCorrect();
}
如您所见,Response
是对象。我猜到了这种数据类型,因为本质上所有问题都有响应。由于它是一个对象,我只为未来的错误(铸造问题)定义了 get 。
我的想法是稍后,在一个具体的类中访问这个属性(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
。
这是一个好方法吗?它会导致未来的错误吗?请给我一个关于我的设计的反馈。
编辑:确实有必要在非通用接口中访问响应。