簡體   English   中英

如何在繼承中實現封裝

[英]how to achieve encapsulation in inheritance

我有兩個類TestEncap 我有一個私有變量a ,可以通過setter和getter方法訪問。 而且我繼承了EncapTest

現在我能夠改變的值, a使用setValue(int a) 我想限制該選項。 我希望它使其成為只讀值。 請協助我。

class Test
{
    private int a;
    protected void setValue(int a)
    {
        this.a = a;
    }
    protected void getValue()
    {
        System.out.println("The assigned value of a is : "+this.a);
    }
}
public class Encap extends Test {
    public static void main(String [] args)
    {
        Test t = new Test();
        t.setValue(4);
        t.getValue();
        Encap e = new Encap();
        e.setValue(3);
        e.getValue();      
    }
}

一種選擇是從Test類中刪除 setValue()方法:

class Test
{
    private int a;

    protected void getValue()
    {
        System.out.println("The assigned value of a is : "+this.a);
    }
}

編輯: 為什么要這樣做? 如果Encap繼承自Test ,則它應該能夠執行與Test相同的操作。 否則,繼承的目的是什么? 如果您仍然認為Test應該能夠修改該值而不能修改Encap ,則可能是您的設計錯誤。 您可以嘗試這樣的方法:

              BaseClass
              ---------
              +getValue
                /   \
               /     \
           Test       Encap
         --------   ---------
        +setValue   

如果您想讓派生類不公開超類的公共方法 ,那么您的代碼可能會“聞起來” ...

請記住,繼承模型為“是”

因此,在您的示例中,Encap 測試,您應該能夠對Encap進行任何測試。

但是,如果您只是必須從不想公開父類方法的類繼承,則可以重寫該方法並使它的主體不執行任何操作。 但是對於簡單的getter和setter訪問器方法,這可能會使您的代碼客戶端感到困惑。

如果您無法調和事情,並且在Encap上調用setValue()永遠都不是正確的事,我建議您重寫該方法,對其進行自由注釋,使其無所事事,或者拋出異常以向客戶端表明他們正在做沒有意義的事情。

暫無
暫無

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

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