【问题标题】:Doubt about how to organize my classes怀疑如何组织我的课程
【发布时间】:2011-08-08 03:52:36
【问题描述】:

这只是我的代码中的一个示例。我正在寻找一种好方法来维护我的课程并遵循一些 OOP 规则。

这是我的抽象类问题:

public abstract class Problem<T> : IEquatable<T>
{
    public abstract int ResultCount { get; }
    protected abstract bool CheckTheAnswer(params object[] results);
    public abstract bool Equals(T other);
}

以下是从 Problem 派生的一个类,Arithetic 类包含数学问题中包含的所有必要内容,以及如何解决它:

public enum Operations
{
    Addition, Subtraction, Multiplication, Division
}

public class Arithmetic : Problem<Arithmetic>
{
    public decimal Number1
    {
        get;
        set;
    }

    public Operations Operation
    {
        get;
        set;
    }

    public decimal Number2
    {
        get;
        set;
    }

    public override int ResultCount
    {
        get { return 1; }
    }

    protected override bool CheckTheAnswer(params object[] results)
    {
        if (results.Length != ResultCount)
            throw new ArgumentException("Only expected " + ResultCount + " arguments.");

        decimal result = (decimal)results[0];

        switch (Operation)
        {
            case Operations.Addition:
                return Number1 + Number2 == result;
            case Operations.Subtraction:
                return Number1 - Number2 == result;
            case Operations.Multiplication:
                return Number1 * Number2 == result;
            case Operations.Division:
                return Number1 / Number2 == result;
            default:
                throw new Exception("Operator unexpected");
        }
    }

    public override bool Equals(Arithmetic other)
    {
        if (other == null)
            return false;

        return this.Number1 == other.Number1 && Number2 == other.Number2;
    }
}

public class Addition : Arithmetic
{
    public Addition(decimal addend1, decimal addend2)
        : base()
    {
        Number1 = addend1;
        Number2 = addend2;
        Operation = Operations.Addition;
    }
}

// Subtraction, Multiplication and Divison here

然后我有另一个生成算术问题的类,它接收一个元组,其中包含一些指示条件的属性

interface IProblemFactory<T> where T : Problem<T>
{
    T Create();
}

public class ArithmeticProblemFactory : IProblemFactory<Arithmetic>
{
    private Tuple<Operations, Range, Range> _condition;

    public ArithmeticProblemFactory(Tuple<Operations, Range, Range> condition)
    {
        this._condition = condition;
    }

    public Arithmetic Create()
    {
        Operations operation = _condition.Item1;
        decimal a = _condition.Item2.GetNumber();
        decimal b = _condition.Item3.GetNumber();

        switch (operation)
        {
            case Operations.Addition:
                return new Addition(a, b);
            case Operations.Subtraction:
                return new Subtraction(a, b);
            case Operations.Multiplication:
                return new Multiplication(a, b);
            case Operations.Division:
                return new Division(a, b);
            default:
                throw new Exception("Operator unexpected");
        }
    }
}

问题是...我需要更多属性,例如 Result(在算术类中只需要 1 个,相比之下 2 个数字我们需要两个属性 result)、问题编号、解决问题的时间(秒)。

问题是,我不知道我应该把这些属性放在哪里。一种方法是在 Problem 类中添加其中一些,或者创建另一个类似这样的类:

算术题

  • Problem Problem

  • 结果

  • 时间

  • 问题编号

我只想按照必须的方式组织我的课程。 提前致谢。

【问题讨论】:

  • 我建议首先清理您现在拥有的设计,然后继续前进。 Operation 枚举的意义何在?对于每种类型的算术运算,您都有子类,因此您不需要枚举。通过将 switch 分支中的代码移动到算术类中抽象方法的实现中,将这些 switch 语句重构为类层次结构。此外,如果您想使用 Equals 方法,请考虑比较操作的类型。

标签: c# oop


【解决方案1】:

您可以有不同的结果类,并且在您的算术类中接受结果类型作为通用:

public class Arithmetic < TResult> : ...

Addition可以如下:

public class Addition : Arithmetic <decimal>
...

但如果参数的数量(如结果、时间、...)不固定(动态),您可以拥有一个字典并将它们存储在字典中(它们的类型)并编写特定的操作并将它们设置为字典的值.

【讨论】:

  • 请看这个问题..这是同一个问题,但更具体stackoverflow.com/questions/6988431/…
  • @oscar.fimbres,我找不到这个问题之间的任何区别,请编辑当前问题。
  • 嗯,我想让您知道的唯一一件事是我需要保留不同的数据类型,例如答案,并且问题可能有多个结果(结果 1 和结果 2)。我在想是否有必要创建另一个类来存储每个数学问题的所有答案
  • @oscar.fimbres,您可以为不同的结果定义一个类并将它们作为通用参数传递(我在回答中提到了这一点)。
  • 但是你不认为创建另一个类来存储这个问题的答案更好吗?我的意思是,一类用于问题,另一类用于答案(这些包含 CheckThe...)我之所以说这些,是因为稍后我可能需要对这些中的每一个进行转换以获得结果。
【解决方案2】:

我建议将结果、时间(生成或解决)和问题编号都放在问题类中。每个问题都有自己的结果、时间和编号;他们也可以包括在内。这使您无需将另一个课程与每个问题联系起来,并且拥有一个包罗万象的问题课程。

【讨论】:

  • 一方面我也这么认为,但是问题包含在Result中的不同数据类型..其中一些Result是类Fraction,其他是小数等。您认为方便吗?答案类?
  • 好吧,如果您想将结果存储为浮点值,您可以添加一个方法将其转换为分数,并且仍然将其全部保存在您的 Problem 类中 :)
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 2011-11-22
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2012-09-11
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多