【发布时间】:2013-01-04 11:13:22
【问题描述】:
我想用 Java 制作一个包含节点的图表。图类将被不同的人和不同的算法使用,因此我们将需要针对每种情况使用不同的节点类,比如DefaultNode 和SpecialNode extends DefaultNode。
现在我希望DefaultNode 包含节点需要工作的所有常规内容,例如直接邻居列表。所以我在DefaultNode中实现了这个列表:
List<DefaultNode> neighbours = new ArrayList<DefaultNode>();
我现在的问题是,我显然也需要 SpecialNode 类中的这个列表,但它应该包含并返回 SpecialNodes。当然,我可以覆盖从DefaultNode 继承的每个类中的列表和addNeighbour() 以及getNeighbours() 方法,但这似乎是多余的,而不是OOP 的工作方式。我认为这将是使用模板的完美案例(如在 C++ 中),但 afaik 在 Java 中没有这样的构造,只剩下泛型。
目前我想出的解决方案如下:
interface INode {}
class DefaultNode<T extends INode> implements INode {
List<T> neighbours;
List<T> getNeighbours(){}
void addNeighbour(T node){}
}
这里,<T extends INode> 括号描述了这个节点的可能邻居。所以对于SpecialNode,我会这样做:
class SpecialNode extends DefaultNode<SpecialNode> {}
现在,虽然这似乎按预期工作,但感觉有点奇怪......我很惊讶我找不到更简单的解决方案,因为这种情况似乎比较普遍。你会如何解决这个问题?我错过了更好/更简单的方法吗?或者上述是一种可行的方法?
【问题讨论】:
-
如果
getNeighbors在DefaultNode中,接口中有哪些方法?即,如果你有一个INode但不知道它到底是什么类型,你能用它做什么? -
你说得对,界面在这里没有多大意义,因为邻居列表和 add/get-methods 不能在那里。虽然它可能包含一般描述节点的其他方法。
标签: java templates generics inheritance