我已经到处寻找我的简单问题的答案,但我可能只是不理解所提供的解决方案,或者我没有在正确的条件下进行搜索。我有一个并行的继承层次结构,有两个抽象基类,每个基类可能有许多子类。伪UML:
Node -----------> NodeData
^ ^
| |
| |
SpecialNode -----> SpecialNodeData
由于Node
类型的对象具有对NodeData
类型的对象的引用,因此当SpecialNode
想要访问SpecialNodeData
特有的方法时,它不能。我理解这个错误,但我不知道如何修复它。我很想完全摆脱继承,但不确定如何保留功能。我很欣赏任何见解(也许是一个有助于解决此类面向对象设计问题的教程的链接?)
示例代码:
interface NodeData {
// methods
}
class Node {
protected NodeData data;
public Node(NodeData data) {
this.data = data;
}
// methods that use the generic NodeData
}
class SpecialNodeData implements NodeData {
int x;
public SpecialNodeData(int x) {
this.x = x;
}
/* Method unique to SpecialNodeData */
public int getx() {
return this.x;
}
// methods to implement generic NodeData
}
class SpecialNode extends Node {
public SpecialNode(int x) {
super(new SpecialNodeData(x));
}
public int getX() {
return data.getX(); // gives Eclipse a sad face:
// "the method getX() is undefined for the type NodeData"
}
}
最佳答案
处理这个问题的方法不止一种。我立即想到两个,一个涉及泛型,另一个涉及协变返回类型。我建议后者:
class Node {
// change this:
private NodeData data;
// add this:
protected NodeData getData() {
return this.data;
}
}
class SpecialNode extends Node {
// add this:
protected SpecialNodeData getData() {
return (SpecialNodeData)(super.getData());
}
// change this:
public int getX() {
return getData().getX();
}
}
这利用了 Java 的能力,可以用协变返回类型定义重写方法。
关于java - 跨并行继承层次结构访问方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521694/