何时子类以及何时在对象模型中使用属性

时间:2013-01-04 21:19:32

标签: c# java oop object-model

我正在为我正在为评估工具工作的对象模型寻找一些指导。目前有两种类型的评估

  • 对等

这两个评估之间的唯一区别是表单在UI中呈现给用户的方式。同行评估将向您的团队中的同行展示您应根据某些标准进行评估,团队评估将根据某些标准显示所有参与评估的团队。除此之外,这两个评估完全相同。

构建对象模型时,我应该创建一个抽象的Evaluation对象,然后将Peer评估和团队评估子类化吗?或者我应该创建一个Evaluation对象并有两个属性来表示两种不同类型的评估?

将来可能会增加更多类型的评估。

3 个答案:

答案 0 :(得分:4)

通常,如果类型只是一条信息,则将其设为字段。如果它用于改变方法的行为,如

public void foo() {
    if (type == PEER) {
        doSomething();
    }
    else {
        doSomethingElse();
    }
}

然后它表明你应该进行子类化,并使用多态来根据类型获得适当的行为。另一种解决方案是使用委托而不是继承,并将行为与类型相关联:

public enum EvaluationType {
    PEER {
        @Override
        public void foo() {
            ...
        }
    },
    TEAM {
        @Override
        public void foo() {
            ...
        }
    };

    public abstract void foo();
}

public class Evaluation {
    private EvaluationType type;

    public void foo() {
        return this.type.foo();
    }
}

答案 1 :(得分:0)

考虑到这一点,在我看来,将此信息存储在Evaluation对象本身是错误的方法。考虑一个现实世界的例子 - 南瓜种子。现在,我可以种下种子,或者我可以烤种子。事实上,对于一个给定的种子,我可以采取一种方式,或另一种方式,但不是两种方式:一些种子已被留下用于进食,一些用于种植,但该种子本身与种子没什么关系。

因此,我建议在其他地方编码区别...也许你有一个EvaluationModel来维护单独的集合(团队与同行)并在适当的时候将它们转发到UI。为什么评估会关注他人如何使用它?你需要的是一个实体,它的工作就是关心,让那个人得出他将要有的区别。

答案 2 :(得分:0)

将一般属性和方法取出到一个接口Say ICommon, 然后让团队和对等点自己的接口实现ICommon ...

interface ICommon{
}

interface ITeam:ICommon{
}

interface IPeer:ICommon{
}

然后实现每个接口(IPeer和ITeam)和您的EvaluationManager(如果有的话)将知道何时实例化每个对象