2008-12-12 41 views

回答

13

那麼你可以使用模板方法模式,其中有多個覆蓋點,都有默認的實現,但組合的默認實現本身不合法 - 任何功能實現都必須繼承。

(是的,我不喜歡的模板方法模式;))

+0

什麼是不喜歡模板方法模式?它當然可以被濫用,但如果明智地使用它,我覺得它非常有幫助。 – 2008-12-12 11:59:28

+2

它的設計非常強烈鎖定了,並導致討厭的解決辦法時,事情變成是不太你的思維方式。它也傾向於創造非常污染的班級等級以及許多奇怪的聯結。 – krosenvold 2008-12-12 12:17:59

4

抽象類是一個聲明爲抽象的類 - 它可能包含或不包含抽象方法。它們不能被實例化,所以如果你有一個帶有具體方法的抽象類,那麼它可以被子類化,然後子類可以被實例化。

+1

這是正確的,但它是不是問題的答案。 – 2008-12-12 11:01:21

0

有趣的問題:)

有一件事是肯定的......這當然是可能的。 krosenvold的模板建議是這樣做的一個很好的理由。

我只想說,一個類不能被宣佈爲abstract只是爲了防止它的實例化。

這是在Java語言規範Section 8.1.1.1

+0

您的鏈接必須修改:[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

4

想象,一個其聲明的方法通常表現出相同的默認行爲實施時接口簡稱。在編寫需要支持接口的類時,您必須反覆定義所述默認行爲。

爲了便於實現具體的類,您可能需要提供一個抽象類,爲每種方法提供默認行爲。爲了支持具體類中的接口,如果它們偏離標準行爲,則可以從抽象類派生並覆蓋方法。這樣你就可以避免重複執行相同(冗餘)的默認行爲。

0

當你有一類重要的,但系統不能創建FO這個類的實例,因爲

  • 這個類是有很多的系統類的父;
  • 這對域的要求有很多責任(很多類使用的方法)
  • 該類不代表具體的對象;
2

另一種可能的用例是將所有調用委託給包裝實例的裝飾器。一個具體的實施裝飾可以覆蓋只有那些方法,其中添加的功能是:

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)。

2

以前的答案已經碰到了主要問題,但有一小部分細節值得一提。

您可以有一個工廠返回抽象類的(隱藏)子類的實例。抽象類定義了結果對象的合同,以及提供缺省實現,但事實是抽象類既保持它被直接實例化,也標誌着一個事實,即「真實」的實現類的身份不出版。

相關問題