Java 跨并行继承层次结构访问方法
我已经到处寻找我的简单问题的答案,但我可能只是不理解提供的解决方案,或者我没有在正确的条件下搜索。我有一个并行继承层次结构,有两个抽象基类,每个基类可能有许多子类。伪UML:Java 跨并行继承层次结构访问方法,java,oop,inheritance,Java,Oop,Inheritance,我已经到处寻找我的简单问题的答案,但我可能只是不理解提供的解决方案,或者我没有在正确的条件下搜索。我有一个并行继承层次结构,有两个抽象基类,每个基类可能有许多子类。伪UML: Node -----------> NodeData ^ ^ | | | | SpecialNode -----> SpecialNo
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的能力,可以用协变返回类型定义重写的方法。处理这个问题的方法不止一种。两种情况立即浮现在脑海中,一种涉及泛型,另一种涉及协变返回类型。我建议后者:
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中的协变返回类型。太酷了@MikeParkhill:仅供参考,方法和构造函数也可以有协变异常类型。有关详细信息,请参阅Java7JLS,第8.4.8.3节。泛型是我的第一个想法。不知道Java中的协变返回类型。太酷了@MikeParkhill:仅供参考,方法和构造函数也可以有协变异常类型。有关详细信息,请参阅Java 7 JLS,第8.4.8.3节。