8

私のシナリオは、数学の問題の開発に関するものです。インターフェースとして、IProblem含まれるべき2つの主要なプロパティはQuestionTextResponse. 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 にアクセスすることが本当に必要です。

4

1 に答える 1

4

多分あなたはこのようなものを探していますか?問題の一般的な解決策の部分 (QuestionText など) にとって重要ではないため、一部を省略したことに注意してください。また、基本クラスはパススルーにすぎず、余分な不要なレイヤーにすぎないように見えたため、省略しました。これはまさにあなたが探しているものではないかもしれませんが、そこにたどり着くのに役立つことを願っています.

まず、これはすべてがどのように使用されるかです
:

private static void StackOverflowQuestion()
{
    IProblem<int> problem1 = new IntProblem(2, 4);
    problem1.Response = 6;

    IProblem<decimal> problem2 = new DecimalProblem(5, 10);
    problem2.Response = .5M;

    Console.WriteLine("Problem 1 is correct: {0}", problem1.IsCorrect());
    Console.WriteLine("Problem 2 is correct: {0}", problem2.IsCorrect());

    List<IProblem> problems = new List<IProblem>();
    problems.Add(problem1);
    problems.Add(problem2);
    problems.ForEach(problem => Debug.WriteLine(problem.GetResponse()));
}

編集:これは非汎用インターフェースなので、多くの問題をリストで使用して同じように扱うことができます:

public interface IProblem
{
    object GetResponse();
}

インターフェースは次のとおりです:
編集: これは現在、非ジェネリック インターフェースを実装していることに注意してください。

public interface IProblem<T> : IProblem
{
    T Response { get; set; }
    bool IsCorrect();
}

編集: 新しいGetResponse
() メソッドに注目してください。

public class IntProblem : IProblem<int>
{
    private int _number1 { get; set; }
    private int _number2 { get; set; }

    public int Response { get; set; }

    public IntProblem(int number1, int number2)
    {
        this._number1 = number1;
        this._number2 = number2;
    }

    public bool IsCorrect()
    {
        return this._number1 + this._number2 == Response;
    }

    public object GetResponse()
    {
        return this.Response;
    }
}

public class DecimalProblem : IProblem<decimal>
{
    private decimal _number1 { get; set; }
    private decimal _number2 { get; set; }

    public decimal Response { get; set; }

    public DecimalProblem(decimal number1, decimal number2)
    {
        this._number1 = number1;
        this._number2 = number2;
    }

    public bool IsCorrect()
    {
        return this._number1 / this._number2 == Response;
    }

    public object GetResponse()
    {
        return this.Response;
    }
}
于 2012-04-20T00:01:53.770 に答える