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"
    }
}
4

1 回答 1

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

于 2012-11-23T00:28:05.370 回答