當某個人的所有方法都具體時,是否有某些人需要聲明一個類抽象的實際編程情形?具有所有具體方法的抽象類
回答
那麼你可以使用模板方法模式,其中有多個覆蓋點,都有默認的實現,但組合的默認實現本身不合法 - 任何功能實現都必須繼承。
(是的,我不喜歡的模板方法模式;))
抽象類是一個聲明爲抽象的類 - 它可能包含或不包含抽象方法。它們不能被實例化,所以如果你有一個帶有具體方法的抽象類,那麼它可以被子類化,然後子類可以被實例化。
這是正確的,但它是不是問題的答案。 – 2008-12-12 11:01:21
有趣的問題:)
有一件事是肯定的......這當然是可能的。 krosenvold的模板建議是這樣做的一個很好的理由。
我只想說,一個類不能被宣佈爲abstract
只是爲了防止它的實例化。
這是在Java語言規範Section 8.1.1.1
您的鏈接必須修改:[8.1.1.1。抽象類(http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.1.1)或[8.8.10。防止類的實例化(http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.10) – Sk8erPeter 2013-01-15 01:03:33
想象,一個其聲明的方法通常表現出相同的默認行爲實施時接口簡稱。在編寫需要支持接口的類時,您必須反覆定義所述默認行爲。
爲了便於實現具體的類,您可能需要提供一個抽象類,爲每種方法提供默認行爲。爲了支持具體類中的接口,如果它們偏離標準行爲,則可以從抽象類派生並覆蓋方法。這樣你就可以避免重複執行相同(冗餘)的默認行爲。
當你有一類重要的,但系統不能創建FO這個類的實例,因爲
- 這個類是有很多的系統類的父;
- 這對域的要求有很多責任(很多類使用的方法)
- 該類不代表具體的對象;
另一種可能的用例是將所有調用委託給包裝實例的裝飾器。一個具體的實施裝飾可以覆蓋只有那些方法,其中添加的功能是:
public interface Foo {
public void bar();
}
public abstract class FooDecorator implements Foo {
private final Foo wrapped;
public FooDecorator(Foo wrapped) { this.wrapped = wrapped; }
public void bar() { wrapped.bar(); }
}
public class TracingFoo extends FooDecorator {
//Omitting constructor code...
public void bar() {
log("Entering bar()");
super.bar();
log("Exiting bar()");
}
}
雖然我實在不明白的必要性申報FooDecorator抽象(非抽象的例子:HttpServletRequestWrapper)。
以前的答案已經碰到了主要問題,但有一小部分細節值得一提。
您可以有一個工廠返回抽象類的(隱藏)子類的實例。抽象類定義了結果對象的合同,以及提供缺省實現,但事實是抽象類既保持它被直接實例化,也標誌着一個事實,即「真實」的實現類的身份不出版。
奇怪,爲什麼沒有人指出MouseAdapter的實際例子:
http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html
接收鼠標事件的抽象適配器類。這個類的 中的方法是空的。這個類存在爲創建 偵聽器對象的便利。
- 1. 具有所有具體方法的普通類和具有所有具體方法的抽象類有什麼區別
- 2. 抽象類中的具體方法
- 3. 從具有更具體方法的抽象基礎繼承
- 4. 具有抽象類參數的抽象方法的Java抽象類
- 5. 抽象類vs具體類?
- 6. 抽象類和具體類
- 7. 覆蓋抽象方法的返回類型與具體類型
- 8. 具體類具體方法
- 9. 具有兩種幾乎相同的方法的Java抽象類
- 10. 具有抽象類作爲參數的方法
- 11. 將接口抽象爲具有擴展方法的類
- 12. 具有共享方法的swift抽象類
- 13. 具有相同通用方法的抽象類和接口
- 14. 一個具體的類VS抽象類
- 15. 抽象類擴展的具體類
- 16. 可以在Php中的抽象類中使用私有的具體方法。
- 17. 抽象類中實現的單元測試方法沒有具體的實現
- 18. 具有多個級別的抽象類
- 19. 抽象類沒有抽象方法
- 20. PHPUnit:在沒有具體方法的情況下測試一個抽象類
- 21. 如何讓抽象方法返回具體實現的抽象類型?
- 22. 使用JMockit測試抽象類的具體方法
- 23. JAXB Unmarshalling期間的InstantiationException(抽象基類,具有@XmlSeeAlso具體子類)
- 24. 從具體的整數類型抽象
- 25. 從具體類拋出時調用抽象方法NullPointerException
- 26. 使用Spring從抽象類調用具體方法
- 27. 繼承具有抽象屬性的抽象類
- 28. 具有抽象類繼承的JPA實體
- 29. 如何用hibernate獲取具體表中的具體類的所有對象?
- 30. 單元測試調用具體子方法的抽象類方法
什麼是不喜歡模板方法模式?它當然可以被濫用,但如果明智地使用它,我覺得它非常有幫助。 – 2008-12-12 11:59:28
它的設計非常強烈鎖定了,並導致討厭的解決辦法時,事情變成是不太你的思維方式。它也傾向於創造非常污染的班級等級以及許多奇怪的聯結。 – krosenvold 2008-12-12 12:17:59