我所有的课程都来自这个T课:
public abstract class Problem<T, TResult> : IEquatable<T>
{
protected Problem()
{
Results = new TResult[ResultCount];
}
protected Problem(int problemNumber, int subject, int seconds) : this()
{
this.ProblemNumber = problemNumber;
this.Subject = subject;
this.Seconds = seconds;
}
public int ProblemNumber { get; set; }
public int Subject { get; set; }
public int Seconds { get; set; }
public abstract int ResultCount { get; }
public TResult[] Results { get; set; }
public abstract bool IsCorrect { get; }
protected abstract bool CheckTheAnswer(params TResult[] results);
public abstract bool Equals(T other);
}
我需要有一个列表,但List请求T和TResult的确定数据类型。好吧,没有必要列表。
我不想使用每个对象数据类型(因为我一直使用超大型开关盒)。
更新1:
我的一个课程就是这个课程:
public class Comparison2 : Problem<Comparison2, Comparators>
{
public Comparison2(decimal number1, decimal number2) : base()
{
this.SetNumbers(number1, number2);
}
public Comparison2(decimal number1, decimal number2, int problemNumber, int subject, int seconds)
: base(problemNumber, subject, seconds)
{
this.SetNumbers(number1, number2);
}
private void SetNumbers(decimal number1, decimal number2)
{
this.Number1 = number1;
this.Number2 = number2;
}
public decimal Number1
{
get;
set;
}
public decimal Number2
{
get;
set;
}
public override int ResultCount
{
get { return 1; }
}
public override bool IsCorrect
{
get { return this.CheckTheAnswer(Results[0]); }
}
protected override bool CheckTheAnswer(params Comparators[] results)
{
if (results.Length != ResultCount)
throw new ArgumentException("Only expected " + ResultCount + " arguments.");
Comparators result = results[0];
switch (result)
{
case Comparators.Minor:
return Number1 < Number2;
case Comparators.Major:
return Number1 > Number2;
case Comparators.Equal:
return Number1 == Number2;
case Comparators.None:
return false;
default:
throw new Exception("Comparator unexpected");
}
}
public override bool Equals(Comparison2 other)
{
if (other == null)
return false;
return this.Number1 == other.Number1 && Number2 == other.Number2;
}
}
我计划将所有这些内容放入List&lt;&gt;并直接提取每个属性。
答案 0 :(得分:1)
object
; ArrayList
代替List<T>
; List<ICommonInterface>
答案 1 :(得分:1)
正如评论中所讨论的,如果没有全局,很难说明如何改进设计。可能是,您必须为每个具体类型T创建一个单独的类,如IntegerProblem,FractionProblem等,但我不确定。
您的部分问题是关注大型switch语句。在您的更新中,您可能没有必要的switch语句,所以我想如果我向您解释如何摆脱这些开关,您可能会在其他地方避免使用其中的许多。
如果您打开对象的类型或状态,这被认为是一个坏习惯。它通常意味着某些其他对象对此对象了解太多(紧密耦合)。你应该让对象本身根据自己的状态行事,而不是向对象询问其状态并根据答案行事。
这在CheckTheAnswer方法中会发生。 Comparison2的一个实例询问Comparators的一个实例是什么状态,然后根据它来做一些工作。相反,您应该要求比较器实例检查Number1和Number2。因此,您需要向Comparators类添加一个抽象方法(您可以将其命名为“check”),该类返回bool并获取两个小数参数。然后为每个状态(例如MinorComparators,MajorComparators和NoneComparators)创建Comparators的子类,并覆盖它们中的抽象方法(“check”),以便每个子类返回与您的开关相同的结果。
这样您就不必编写大型开关,并且可以添加新类型的比较器,而无需更改任何问题子类。
答案 2 :(得分:0)
不确定您需要对这些项目做些什么,但Visitor模式可能会对您有所帮助。
访客模式允许您以非常方便的方式遍历异类项目列表。
答案 3 :(得分:0)
您必须使用object作为问题的类型参数。编译器不能做魔术...如果你将不同类型的问题元素粘贴到List中,那些元素唯一的共同点就是它们派生自对象
答案 4 :(得分:0)
我没有答案,但已经找到了如何在UML中显示它的图形表示。 希望这有帮助 alt text http://www.forum-omondo.com/documentation_eclipseuml_2008/jdk15/uml_editor_generic_type.png