2011-04-17 21 views
0

我想知道如何拒絕訪問類的超類方法?我如何拒絕訪問超類的方法

例如:我有一個類門和一個類Emptyness,它基本上只是我的應用程序的開放門,現在我想繼承大多數門的方法,但我不希望用戶能夠調用'關門'方法對空虛,我該怎麼做?

+0

使方法私人? – Marnix 2011-04-17 16:23:03

+0

但是,用戶無法在門上調用它嗎? – Samuel 2011-04-17 16:26:25

回答

2

這聽起來像Emptyness失敗,「我應該是一個子類」關於Door測試。測試是,以下句子成立:EmptynessDoor。由於Door可以關閉,因此Emptyness不符合該要求。

推薦使用聚合而不是繼承。有Emptyness實現它自己的接口(或某些其他相關接口,但不是Door)和包含 a Door它用於滿足相關操作的實例。

做類似重寫close操作什麼也不做,或拋出一個異常是完全不合適的,除非Door#close被定義爲可選(通過throws標籤爲相關的例外)。 (注意類層次結構中的「可選」操作,它們通常指示設計問題,但不一定總是,但通常是)。Andreas給出的示例Iterator#remove,例如:Iterator#remove被標記爲拋出UnsupportedOperationException。如果Door#close被貼上標籤,並且如果你對這種做事感到滿意,那麼很棒,你就在那裏。但如果沒有,那麼Emptyness將無法​​兌現Door合同,這通常意味着您需要換個方式。

0

使在課堂上私人門。因爲如果你有公共或超級保護,那麼你不能向下等級更限制訪問修飾符。所以你不能在Empty類中做私人,而是你必須在Door類中。

0

有很多選擇。無論選擇哪種適合您的需要

  1. 使該方法private
  2. 使該方法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(); 
          } 
         } 
        } 
    
+1

老實說,我不喜歡它 - 一個班級不應該實現功能,這個功能清楚而完全屬於一個子類 - 在這種情況下:「空虛無法關上門」。 – 2011-04-17 16:50:30

+0

既不是我。它編譯但不是面向對象。我的錯 – Abhishek 2011-04-17 16:57:31

3

我們顯然不能減輕重載的方法可視性。如果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"); 
    } 
} 
0

爲什麼不使用設計器模式。 由於closeDoor方法並不適用於Door的所有子類,因此它不應該出現在Door類中,而應該使用close方法創建一個名爲Closable的接口,並在類ClosableTrue和ClosableFalse中實現該接口。現在在Closable類型的Door類中創建一個引用變量,並根據傳遞給構造函數的參數的類型,使用ClosableTrue或ClosableFalse對象在類的構造函數中初始化它。現在,無論何時在Door的任何對象或Door的子類上調用close方法時,將被調用的方法將是其類被用於初始化Door構造函數的方法。您可以實現ClosableFalse類的close方法,而不需要任何有意義的功能。