跨并行继承层次结构访问方法

时间:2012-11-23 00:21:56

标签: java oop inheritance

我一直在寻找我的简单问题的答案,但我可能只是不理解所提供的解决方案,或者我没有按照正确的条款进行搜索。我有一个并行继承层次结构,有两个抽象基类,每个基类可能有很多子类。伪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 个答案:

答案 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使用协变返回类型定义重写方法的能力。