维护列表<>其中包含几个类T.

时间:2011-08-09 03:54:57

标签: c# oop uml

我所有的课程都来自这个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;并直接提取每个属性。

5 个答案:

答案 0 :(得分:1)

  1. 您可以使用object;
  2. 您可以使用ArrayList代替List<T>;
  3. 您可以为两种类型创建一个通用界面,并在列表中使用它: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