[英]how to achieve encapsulation in inheritance
我有兩個類Test
和Encap
。 我有一個私有變量a
,可以通過setter和getter方法訪問。 而且我繼承了Encap
類Test
。
現在我能夠改變的值, 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.