更改继承类

时间:2017-08-26 15:08:11

标签: java inheritance access

我有两节课:GraphNodeBTNode extends GraphNode。我有方法:

public GraphNode.addChild(GraphNode node)

因为GraphNode可能有很多孩子 和两种方法:

public BTNode.addLeftChild(BTNode left)
public BTNode.addRightChild(BTNode right)

因为BTNode可能只有两个孩子

如何限制BTNode类对继承的addChild(GraphNode node)方法的公共访问?我不希望从该级别公开访问(同时保留GraphNode类的公共访问权限)?

3 个答案:

答案 0 :(得分:1)

如果从类(或接口)扩展(或实现),则父级将指定方法的整个签名。您可以更改,如果您的父母将其指定为公开,您将始终需要使用方法公开

否则在像((Parent) child).theMethod()一样投射时会遇到问题。对象本身是child,但视图会缩减为Parent类。该方法是从child类调用的,因此它会私有,尽管您将其投放到Parent,并将其指定为 public

但是你可以这样做:

public class Child extends Parent {
    @Override
    public void theMethod() throws UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }

    private void otherMethod {
        // Do something
    }
}

但请注意,“我正在扩展类XY但不支持其所有方法”并不是最好的设计。这表明父类(或架构的其他部分)首先可以构建得更加模块化。

答案 1 :(得分:1)

无法降低子类中方法的可见性。子类需要是基类的有效实例。

答案 2 :(得分:0)

正如您在前面的答案中所看到的,无法更改子类中public方法的可见性。但是如果你是GraphNode类的设计者,你可以使用另一个类层次结构:

public abstract class BaseNode {
    protected final Map<String, GraphNode> children = new HashMap<>();

    protected void addChild(String id, GraphNode node) {
        children.put(id, node);
    }
}

public class GraphNode extends BaseNode {
    public void addChild(GraphNode node) {
        children.put(String.valueOf(System.currentTimeMillis()), node);
    }
}

public class BTNode extends BaseNode {
    private static final String LEFT = "left";
    private static final String RIGHT = "right";

    public void addLeftChild(BTNode node) {
        addChild(LEFT, node);
    }

    public void addRightChild(BTNode node) {
        addChild(RIGHT, node);
    }
}