Я работаю над эволюционной имитационной моделью, реализованной в Java, и столкнулся с ключевой проблемой проектирования объектно-ориентированной архитектуры, которую я не могу решить.Проблема может быть кратко изложена следующим образом:
У меня есть базовый абстрактный класс Player и два конкретных подкласса, Signaller и Receiver:
abstract class Player
{
Strategy[] strategies;
double fitness;
...
}
class Signaller extends Player
{
double quality;
....
}
class Receiver extends Player
{
double[] weights;
int chosenChannel;
....
}
Теперь мне нужны классы, которые представляют коллекции Signalers и Receivers.и я вынужден использовать массивы для их хранения.Существуют методы, общие для обоих типов населения, но также и специальные методы для населения сигнального или для населения получателя.
Концептуально , мне нужно что-то вроде этого:
abstract class Population
{
Player[] members;
void mixUpPopulation() {...}
Strategy[] getMeanStrategies() {...}
double getMeanFitness() {...}
...
}
class SignallerPopulation extends Population
{
Signaller[] members;
...
}
class ReceiverPopulation extends Population
{
Receiver[] members;
double[] getChannelPreferences() {...}
...
}
Я думал о двух основных способах достижения этой цели:
Иметь иерархию классов, как описано выше.
Проблема : Как может Player[]
в суперклассе, а также Signaller[]
или Receiver[]
в подклассах относятся к одной и той же коллекции объектов?
Сделать базовый класс универсальным:
class Population <T extends Player>
{
...
T[] members = (T[])new Object[popSize];
}
Задача : Как реализовать методы, специфичные для каждого из типов населения?
Буду признателен за ваше понимание этих проблем или, возможно, предложения других способов.решения проблемы.