【发布时间】:2011-02-05 23:37:32
【问题描述】:
我正在研究一个用 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];
}
问题:如何实现针对每种人口类型的特定方法?
感谢您对这些问题的见解或对解决问题的其他方法的建议。
【问题讨论】:
-
我认为数组和泛型会带来麻烦。尝试编译建议的第二条语句...为什么不使用 ArrayList
? -
我只能使用数组来存储它们 - 为什么?
-
嗨@Alex,如果你已经解决了,你能发布工作示例吗?我发现很难理解这个示例。我们将不胜感激。
-
@Karussell 您对数组和泛型的看法是正确的,没有优雅的方式来处理这种组合。这就是我决定不使用它的原因。
-
@Paŭlo Ebermann 我需要使用数组的原因更复杂,超出了我的问题范围。简而言之,我的模拟运行速度将比其他类型的集合更快。
标签: java generics inheritance