首先我有一组Individual

class Individual {
    double characteristics[];
    abstract double CalculateValue();
    ...
}


每个人都有一套特征。这些特性将由我的库的用户通过继承实现:

class MyIndividualABC : Individual {
    public MyIndividualABC() {
        characteristics = new double[2];
        characteristics[0] = 123;
        characteristics[1] = 456;
    }

    public override double CalculateValue() {
        return characteristics[0] / characteristics[1]; //for example
    }
}


然后,我将把它们带给他们每个人一个分数(基于他们的价值)。我将其称为迭代。

class EvaluatedIndividual {
    double value;
    double score; //score was calculated based on value
}


从迭代2以后,我将始终拥有类型为EvaluatedIndividual的对象。但是第一次,我将不得不使用Individual类型的对象。

我不想以不同于其他迭代的方式来对待第一轮迭代。我应该如何处理?

打个比方便是有一班学生。在第一次考试之前,您只知道他们的名字,从第一次考试开始,您将获得他们的名字和那一刻的平均分数。

我已经设计了3种不同的方式来处理此问题:


我的程序上将有一个Start()方法,然后有一个Iteration()Start()采用Individual[],而Iteration()采用EvaluatedIndividual[]。哈基,但会创造奇迹。如果没有更好的办法,将使用此方法。
EvaluatedIndividual继承自Individual。这看起来很干净,但是我不太确定,因为我希望Individual作为接口,我的想法是允许我的库/框架的客户端从中继承并定义一组方法/字段在Individual上随意设置(例如,Individual可以具有多个值,用于计算value)。如果我采用这种方法,则必须使他也实现EvaluatedIndividual中的类。
个体由值以及evaluationwasEvaluated组成。最初,wasEvaluated为false,因此任何尝试收集value都将引发Exception。我不太喜欢这样,但我不确定为什么。


您如何处理这个?这可能是一个很常见的模式,但是我恐怕不知道有任何匹配这种情况的GoF模式:(

谢谢

最佳答案

我只是为了简单;我这里只有一堂课。在C#中可能使用Nullable<T>

double? Score {get;set;}


在Java(显然缺少Nullable<T>)中,可能只是将分数与isEvaluated标志(或评估的考试数量计数)一起显示-如果它是false(或0),则可以忽略分数。

10-05 22:59