首先我有一组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
中的类。个体由值以及
evaluation
和wasEvaluated
组成。最初,wasEvaluated为false,因此任何尝试收集value
都将引发Exception。我不太喜欢这样,但我不确定为什么。您如何处理这个?这可能是一个很常见的模式,但是我恐怕不知道有任何匹配这种情况的GoF模式:(
谢谢
最佳答案
我只是为了简单;我这里只有一堂课。在C#中可能使用Nullable<T>
:
double? Score {get;set;}
在Java(显然缺少
Nullable<T>
)中,可能只是将分数与isEvaluated
标志(或评估的考试数量计数)一起显示-如果它是false
(或0
),则可以忽略分数。