更改继承类中方法的可见性



我有两个类: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 类的公共访问(?

如果从类(或接口(扩展(或实现(,则父级将指定方法的整个签名。您对此没有任何可以更改的内容,如果您的父母将其指定为public,您将始终需要将该方法设为public

否则,在像((Parent) child).theMethod()这样的投射时会遇到问题。对象本身是child但视图会简化为Parent类。该方法从child类调用,因此尽管您将其强制转换为将其指定为公共Parent,但它仍然是私有的。

但是,您可以执行以下操作:

public class Child extends Parent {
@Override
public void theMethod() throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}
private void otherMethod {
// Do something
}
}

但请注意,说">我正在扩展 XY 类,但不支持它的所有方法"并不是最好的设计。这表明父类(或体系结构的其他部分(本来可以首先构建得更加模块化。

不可能降低子类中方法的可见性。子类必须是基类的有效实例。

正如您在前面的答案中看到的那样,无法更改子类中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);
}
}

最新更新