[英]Changing visibility of method in inherited class
我有兩個類: 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 類的公開訪問)?
如果您從類(或接口)擴展(或實現),則父類將指定方法的整個簽名。 沒有什么可以改變它,你將永遠需要的,如果你的父母其指定為公眾有方法public。
否則你會在像((Parent) child).theMethod()
這樣的轉換時遇到問題。 對象本身是child
對象,但視圖減少到Parent
類。 該方法是從child
類調用的,因此盡管您將其強制轉換為將其指定為public 的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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.