簡體   English   中英

更改繼承類中方法的可見性

[英]Changing visibility of method in inherited class

我有兩個類: 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。

否則你會在像((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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM