2010-02-17 91 views

回答

15

這個職位和身體的主題提出兩個不同的問題:

  1. 它應該至少有一個抽象的成員?
  2. 是否有必要擁有至少一個抽象成員?

#2的答案肯定是否定的。

#1的答案是主觀的和風格的問題。我個人會說是。如果您的目的是阻止一個類(沒有抽象方法)被實例化,那麼處理這個類的最好方法是使用構造函數,而不是將其標記爲abstract

+0

可能有一些概念性的原因,爲什麼你可能想要一個恰巧沒有任何抽象方法的抽象類... – thecoop

+0

在抽象類中你不需要抽象方法的場景的任何例子? –

+0

@sai praveen,MouseAdapter是一個例子(如果有點專業和高度特定語言)。 – Yishai

6

否 - 您可以在沒有任何抽象方法的情況下聲明類抽象。從概念上講,這個類的實例可能沒有任何意義,或者您可能希望確保只有該類的子類可以實例化(無論出於何種原因)

+3

+1這個答案在這裏是最「重點」和簡潔的答案。謝謝! – AndHeCodedIt

14

不,這不是必需的。您經常會看到"template method"設計模式,例如HttpServlet,其中每種方法都已定義默認行爲,您可以自由覆蓋其中的一個(或多個)而不是其中的所有而不是其中的一個(或多個)。

+0

+1,因爲這至少偶爾是個好主意,但我覺得有點奇怪,任何模板方法模式類都可以有一個理智的默認設置。 – dsimcha

+0

如果使用'HttpServlet',它很有用,它完全按照HTTP規範的規定,在默認實現的'doXXX()'方法中定義返回HTTP錯誤503「方法不允許」。 – BalusC

9

在JDK 1.0中確實有必要在抽象類中至少有一個抽象方法。在JDK 1.1(1997?(我很老))中刪除了這個限制,並將這些類添加到Java庫中,例如java.awt.event.KeyAdapter

在C++中,您至少需要一個純虛函數來創建子類,並且至少有一個虛函數可以將RTTI添加到類中。通常使用析構函數是有意義的。

注意重寫非抽象方法時,使用@Override是個不錯的主意。它不僅告訴讀者關於代碼試圖做什麼的重要信息,而且還會發現拼寫錯誤或不正確的參數類型阻止覆蓋的常見錯誤。

+2

+1爲歷史課。 :) –

-1

如果一個類的聲明中有一個abstract修飾符,它將變爲abstract類。

+2

當沒有抽象方法時,將類定義爲抽象語法是完全有效的。我並不低調,但這個回答實際上是不正確的。請注意,問題的語言是Java,而不是C++。 – CPerkins

+0

@CPerkins - 我的意思是說「不要相反」。 – fastcodejava

+0

而你仍然錯了。如果一個類具有「抽象」修飾符,則它是抽象的,不管它是否具有抽象方法。 – EJP