我想在Java中制作一个节点图。图类将由不同的人和不同的算法使用,因此对于每种情况,我们将需要不同的Node类,例如DefaultNode
和SpecialNode extends DefaultNode
。
现在,我希望DefaultNode
包含节点需要工作的所有常规内容,例如直接邻居列表。因此,我在DefaultNode
中实现了该列表:
List<DefaultNode> neighbours = new ArrayList<DefaultNode>();
我的问题是,显然我在
SpecialNode
类中也需要此列表,但该列表应包含并返回SpecialNodes。当然,我可以覆盖从addNeighbour()
继承的每个类中的list和getNeighbours()
以及DefaultNode
方法,但这似乎是多余的,而不是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> {}
现在,虽然这似乎可以按预期工作,但感觉有点奇怪……我很惊讶我找不到更简单的解决方案,因为这种情况似乎相对普遍。您将如何解决?我错过了更好/更简单的方法吗?还是上述可行的方法?
最佳答案
您的方法没有错。实际上,某些标准接口(例如Comparable
)正是以这种方式定义的:
public class Fruit implements Comparable<Fruit> {
^^^^^ ^^^^^