我想知道如何拒絕訪問類的超類方法?我如何拒絕訪問超類的方法
例如:我有一個類門和一個類Emptyness,它基本上只是我的應用程序的開放門,現在我想繼承大多數門的方法,但我不希望用戶能夠調用'關門'方法對空虛,我該怎麼做?
我想知道如何拒絕訪問類的超類方法?我如何拒絕訪問超類的方法
例如:我有一個類門和一個類Emptyness,它基本上只是我的應用程序的開放門,現在我想繼承大多數門的方法,但我不希望用戶能夠調用'關門'方法對空虛,我該怎麼做?
這聽起來像Emptyness
失敗,「我應該是一個子類」關於Door
測試。測試是,以下句子成立:Emptyness
是Door
。由於Door
可以關閉,因此Emptyness
不符合該要求。
推薦使用聚合而不是繼承。有Emptyness
實現它自己的接口(或某些其他相關接口,但不是Door
)和包含 a Door
它用於滿足相關操作的實例。
做類似重寫close
操作什麼也不做,或拋出一個異常是完全不合適的,除非Door#close
被定義爲可選(通過throws
標籤爲相關的例外)。 (注意類層次結構中的「可選」操作,它們通常指示設計問題,但不一定總是,但通常是)。Andreas給出的示例Iterator#remove
,例如:Iterator#remove
被標記爲拋出UnsupportedOperationException
。如果Door#close
被貼上標籤,並且如果你對這種做事感到滿意,那麼很棒,你就在那裏。但如果沒有,那麼Emptyness
將無法兌現Door
合同,這通常意味着您需要換個方式。
使在課堂上私人門。因爲如果你有公共或超級保護,那麼你不能有向下等級更限制訪問修飾符。所以你不能在Empty類中做私人,而是你必須在Door類中。
有很多選擇。無論選擇哪種適合您的需要
private
使該方法final
,使其不能被重寫,並添加了邏輯檢查,如果該方法是越來越從instanceof
空靈稱爲然後拋出例外。
public class Emptiness extends Door{
public static void main(String[] args) throws Exception {
Door x = new Emptiness();
x.somemethod();
}
}
門類
public class Door {
final public void somemethod() throws Exception{
if(this instanceof Emptiness){
throw new Exception();
}
}
}
老實說,我不喜歡它 - 一個班級不應該實現功能,這個功能清楚而完全屬於一個子類 - 在這種情況下:「空虛無法關上門」。 – 2011-04-17 16:50:30
既不是我。它編譯但不是面向對象。我的錯 – Abhishek 2011-04-17 16:57:31
我們顯然不能減輕重載的方法可視性。如果Door
的關門方法是public
,在Emptyness
的覆蓋方法不能是私有的......
一個通常的做法是覆蓋Emptyness
的關門方法和乾脆什麼也不做或拋出一些UnsupportedOperationException
(如實施者的Iterator
做,如果他們不允許刪除一個元素)。
例子:
public class Door {
public void closeDoor() {
// closing door actions
}
}
public class Emptyness extends Door {
@Override void closeDoor() {
// do nothing or
throw new UnsupportedOperationException("Can't close door on Emptyness");
}
}
爲什麼不使用設計器模式。 由於closeDoor方法並不適用於Door的所有子類,因此它不應該出現在Door類中,而應該使用close方法創建一個名爲Closable的接口,並在類ClosableTrue和ClosableFalse中實現該接口。現在在Closable類型的Door類中創建一個引用變量,並根據傳遞給構造函數的參數的類型,使用ClosableTrue或ClosableFalse對象在類的構造函數中初始化它。現在,無論何時在Door的任何對象或Door的子類上調用close方法時,將被調用的方法將是其類被用於初始化Door構造函數的方法。您可以實現ClosableFalse類的close方法,而不需要任何有意義的功能。
使方法私人? – Marnix 2011-04-17 16:23:03
但是,用戶無法在門上調用它嗎? – Samuel 2011-04-17 16:26:25