我一直在寻找我的简单问题的答案,但我可能只是不理解所提供的解决方案,或者我没有按照正确的条款进行搜索。我有一个并行继承层次结构,有两个抽象基类,每个基类可能有很多子类。伪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"
}
}
答案 0 :(得分:1)
处理此问题的方法不止一种。两个人立即想到,一个涉及泛型,另一个涉及协变返回类型。我提议后者:
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使用协变返回类型定义重写方法的能力。