【发布时间】: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 方法,请考虑比较操作的类型。