8

我的场景是关于开发数学问题。作为一个IProblem接口,我认为它应该包含的两个主要属性是QuestionTextResponseQuestionText始终是字符串,但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

这是一个好方法吗?它会导致未来的错误吗?请给我一个关于我的设计的反馈。

编辑:确实有必要在非通用接口中访问响应。

4

1 回答 1

4

也许你正在寻找这样的东西?请注意,我遗漏了一些内容,因为它们对于问题的通用解决方案部分(如 QuestionText)并不重要。我还省略了基类,因为它看起来只不过是一个传递,以及一个额外的、不必要的层。这可能不是您正在寻找的东西,但我希望它可以帮助您实现目标。

首先,这是所有东西的使用方式:
编辑:注意它们现在如何都被视为非泛型 IProblem。

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 回答