Сначала у меня есть набор 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
.
Мне бы не хотелось обрабатывать первую итерацию иначе, чем другие. Как мне подойти к этому?
Аналогия будет иметь класс студентов. Перед первым экзаменом вы просто знаете их имена, и начиная с 1-го экзамена вы будете иметь как свои имена, так и средние баллы их экзаменов до этого момента.
Я разработал 3 различных способа справиться с этим:
У меня будет метод Start()
в моей программе, а затем Iteration()
. Start()
занимает Individual[]
, а Iteration()
- EvaluatedIndividual[]
. Хаки, но творит чудеса. Будет использовать это, если ничего лучше не придет.
EvaluatedIndividual
наследуется от Individual
. Это выглядит чисто, но я не слишком уверен в этом, потому что я хотел бы, чтобы Individual
был интерфейсом, и моя идея состояла бы в том, чтобы позволить клиенту моей библиотеки / фреймворка наследовать от него и определять набор методов / полей на Individual
, как он хочет (Individual
может иметь несколько значений, которые будут приняты во внимание, например, для вычисления value
). Если я буду следовать этому подходу, мне придется заставить его также реализовать класс из EvaluatedIndividual
.
Индивид формируется по значению, а также evaluation
и wasEvaluated
. Сначала wasEvaluated был false, поэтому любая попытка собрать value
вызывает исключение. Мне не особенно нравится это, но я не уверен почему.
Как вы подошли к этому? Вероятно, это довольно распространенный шаблон, но, боюсь, я не знаю ни одного шаблона GoF, соответствующего этому сценарию: (
Спасибо