簡體   English   中英

Java中受保護的類結構?

[英]Protected class structure in Java?

我想知道Java中是否有語言功能,其中超類的方法對於子類的成員是不可見的:

 public class Subclass extends protected Superclass

或者其他的東西。 我舉一個例子。

這是您的超類。

public class A{
    public String getA(){...}
    public String getB(){...}
    public String getC(){...}
    public void setA(String a){...}
    public void setB(String b){...}
    public void setC(String c){...}
}

如果您想在保護其某些方法的同時將A繼承為子類,並且除非覆蓋它們就無法在方法中更改訪問修飾符,否則最終會得到如下內容:

public class B extends A{
    private String getA(){return super.getA();}
    private String getB(){return super.getB();}//These four methods have
    private void setA(String a){super.setA(a);}//to be redeclared.
    private void setB(String b){super.setB(b);}

    public String getC(){return super.getC();}//These two methods can be
    public void setC(String c){super.setC(c);}//removed.
    public String getD(){...}
    public void setD(String d){...}
}

要么,要么您可以保留A的私有實例,並擁有以下內容:

public class B{

    private A obj;

    private String getA(){return obj.getA();}
    private String getB(){return obj.getB();}//These four methods can also
    private void setA(String a){obj.setA(a);}//be removed.
    private void setB(String b){obj.setB(b);}

    public String getC(){return obj.getC();}//These two methods are
    public void setC(String c){obj.setC(c);}//redeclared.
    public String getD(){...}
    public void setD(String d){...}
}

您是否可以通過不必重新聲明任何方法的方式來兼顧兩者?

與C ++中的情況不同,Java中沒有“非公共”繼承。

繼承創建子類型關系。 B的任何實例也是A的實例,並且應響應相同的消息。 如果B實例顯然不響應A實例響應的所有消息,則繼承無論如何都是不合適的。

您的最后一個解決方案(B不繼承自A)是合適的解決方案:您沒有創建子類型關系,只需使用一種類型(秘密地)實現另一種即可。

我認為這是不可能的,也不應該是可能的。

如果使用繼承以使B擴展A,則應該能夠將B對象用作A對象。 例如,這將是可能的:

A obj = new B();

現在,程序無法知道您無法調用A的某些公共方法。

沒有繼承,功能的重新定義是不可避免的。

除了在超類中將字段/方法設置為私有外,我認為沒有辦法解決此問題。

我認為最好的選擇是第二種選擇,其中B類擁有對A類的私有引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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