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

标签 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"
    }
}

最佳答案

处理这个问题的方法不止一种。我立即想到两个,一个涉及泛型,另一个涉及协变返回类型。我建议后者:

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 - 跨并行继承层次结构访问方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521694/

相关文章:

java - 在子类中使用 super 或 this 访问父类(super class)中的属性?

java - JaxB 性能增强

matlab - 从类内调用类方法 : not enough input arguments

c++ - 传递基类指针

c# - 使用什么样的数据结构?

javascript - 包含重复项函数不会返回 true?

java - 声明子类时类型不兼容

java - 从 PHP MySql 填充 Android spinner

java - 添加到 JLabel 方法?

java - io.confluence 的不可解析父 POM :kafka-connect-storage