私のシナリオは、数学の問題の開発に関するものです。インターフェースとして、IProblem
含まれるべき2つの主要なプロパティはQuestionText
とResponse
. QuestionText
常に文字列になりますResponse
が、複雑なオブジェクト (カスタム構造体Fraction
) または文字列、10 進数、int などの別のデータ型になる場合もあります。
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
。
これは良い方法ですか?将来のエラーを引き起こす可能性はありますか? 私のデザインについてフィードバックをお願いします。
編集: 非汎用インターフェースで Response にアクセスすることが本当に必要です。