2012-11-23 44 views
1

我已经找遍了所有的问题找到我的简单问题的答案,但我可能只是不理解所提供的解决方案,或者我没有在正确的条件下搜索。我有一个并行继承层次结构,有两个抽象基类,每个都有可能有很多孩子。伪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" 
    } 
} 

回答

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的重载方法的定义与协变返回类型的能力。

+0

泛型是我的第一个想法。不知道Java中的协变返回类型。这很酷! –

+0

@MikeParkhill:仅供参考,方法和构造函数也可以有协变异常类型。有关详细信息,请参阅Java 7 JLS的第8.4.8.3节。 –