我有两节课:GraphNode
和BTNode extends GraphNode
。我有方法:
public GraphNode.addChild(GraphNode node)
因为GraphNode可能有很多孩子 和两种方法:
public BTNode.addLeftChild(BTNode left)
public BTNode.addRightChild(BTNode right)
因为BTNode可能只有两个孩子
如何限制BTNode类对继承的addChild(GraphNode node)
方法的公共访问?我不希望从该级别公开访问(同时保留GraphNode类的公共访问权限)?
答案 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);
}
}