2017-07-17 79 views
4
public class BaseClass { 
    /** 
    * Gets the value. 
    */ 
    public final String getValue() { 
     // returns something. 
    } 
} 

public class SubClass extends BaseClass { 
    /** 
    * Gets the value. 
    * <p/> 
    * The value is meaningless for SubClass. 
    */ 
    @Override // Cannot override final method 
    public final String getValue() { 
     super.getValue(); // Not overriding implementation, just javadoc 
    } 
} 

我不需要改變最終方法的實現,我只是想改變它的Javadoc。如何覆蓋子類中的最後一個方法的javadoc?

+2

*「該值對於SubClass是沒有意義的。」*這告訴我們子類不應該是子類,因爲它不通過「是」測試。如果這個值對'BaseClass'有意義,那麼'SubClass'應該是有意義的,因爲'SubClass'是一個'BaseClass'(加號)。爲'BaseClass'編寫的代碼,可能希望'value'有意義,應該使用'SubClass'。也許你想要組成而不是繼承。 –

+1

呃...你不能。爲什麼不簡單地把解釋放到班級的文件中? – Seelenvirtuose

+0

你的問題沒有意義。您無法重寫該方法,那麼爲什麼要重寫它的文檔? – EJP

回答

7

簡而言之:你不能那樣做。如果有的話,你可以在該子類的定義中加入一些javadoc,以解釋最後一種方法的行爲已經發生了變化。如果你可以這樣做 - 你可以改變基類類的javadoc來說:「子類可能使這個方法失效」或類似的東西。

除此之外,你應該明白,這也是一個可疑想法明智的。

繼承不是主要關於代碼重用。這是關於表達一些A類is-a B,因爲A擴展B.因此,當您決定在子類上創建方法毫無意義的時,您基本上使超類的合約無效。這是不好的做法(請參閱Liskov substitution principle爲什麼你必須小心,當修改繼承方法的合同)。

你看,那個關鍵字最後不僅是編譯器的信息。它還表示意圖由誰使用它的人非常方法。這個人說:「我不希望用這種方法得到脾氣!」

+2

特別是如果方法被聲明爲「final」,則意味着沒有任何子類會通過重載它來混淆它。 – fhossfel

+0

好點。把我的答案說成是這個。 – GhostCat

2

這不是Java預見到的,因此使用標準Java工具是不可能的。儘管如此,你可以在課堂上提供更詳細的解釋。您也可以嘗試查看Javadoc API(Doclet API)並搜索它的一些自定義實現或實現您自己的擴展,例如,在類級別引入新的註釋,並實現自定義的Javadoc生成器來尊重這些。我不知道這樣的事情是否已經存在。

更新: 另請參閱GhostCat answer,他有很多原因讓你不應該那樣做。