2010-02-17 18 views

Antwort

15

Gegenstand dieser Post und der Körper stellt zwei verschiedene Fragen:

  1. Sollte es mindestens ein abstraktes Mitglied hat?
  2. Ist es notwendig, mindestens ein abstraktes Mitglied zu haben?

Die Antwort auf # 2 ist definitiv nein.

Die Antwort auf # 1 ist subjektiv und eine Frage des Stils. Persönlich würde ich ja sagen. Wenn Sie verhindern wollen, dass eine Klasse (ohne abstrakte Methoden) instanziiert wird, ist dies am besten mit einem Konstruktor zu bewerkstelligen, und nicht mit abstract.

+0

Möglicherweise gibt es konzeptionelle Gründe, warum Sie eine abstrakte Klasse wünschen, die keine abstrakten Methoden enthält ... – thecoop

+0

Jedes Beispiel für ein solches Szenario, in dem Sie keine abstrakte Methode in einer abstrakten Klasse benötigen? –

+0

@sai praveen, MouseAdapter ist ein Beispiel (wenn ein bisschen Spezialität und stark sprachspezifisch). – Yishai

6

Nein - Sie können eine Klassenzusammenfassung ohne abstrakte Methoden deklarieren. Es macht möglicherweise keinen Sinn, wenn eine Instanz dieser Klasse existiert, oder Sie möchten sicherstellen, dass nur Unterklassen dieser Klasse instanziiert werden können (aus welchen Gründen auch immer).

+3

+1 Diese Antwort die meisten "auf den Punkt" und knappe Antwort hier. Vielen Dank! – AndHeCodedIt

14

Nein, das ist nicht notwendig. Sie sehen dies oft zurück in "template method" Design-Muster, wie HttpServlet, wobei jede Methode bereits Standardverhalten definiert hat und Sie sind frei, nur eine (oder mehrere) von ihnen anstelle alle von ihnen zu überschreiben.

+0

+1, weil dies zumindest gelegentlich ein guter Punkt ist, obwohl ich es ein wenig seltsam finde, dass jede Template-Methode-Musterklasse für alles einen vernünftigen Standard haben könnte. – dsimcha

+0

Im Falle von 'HttpServlet' ist es sinnvoll, HTTP-Fehler 503" Method not allowed "in einer der standardmäßig implementierten' doXXX() 'Methoden zurückzugeben, voll gemäß der HTTP-Spezifikation. – BalusC

9

In JDK 1.0 war es in der Tat notwendig, mindestens eine abstrakte Methode in einer abstrakten Klasse zu haben. Diese Einschränkung wurde in JDK 1.1 (1997? (Ich bin alt)) entfernt, und solche Klassen wurden der Java-Bibliothek hinzugefügt, z. B. java.awt.event.KeyAdapter.

In C++ benötigen Sie mindestens eine reine virtuelle Funktion, um eine Unterklasse erforderlich zu machen, und mindestens eine virtuelle Funktion, um RTTI zur Klasse hinzuzufügen. In der Regel ist es sinnvoll, den Destruktor zu verwenden.

Hinweis beim Überschreiben nicht abstrakter Methoden ist die Verwendung von @Override eine gute Idee. Es informiert den Leser nicht nur über wichtige Informationen zu dem, was der Code versucht, sondern entdeckt auch häufige Fehler, bei denen Tippfehler oder falsche Parameter die Überschreibung verhindern.

+2

+1 für die Geschichtsstunde. :) –

-1

Wenn eine Klasse einen abstract Modifizierer auf ihrer Deklaration hat, wird sie abstract Klasse.

+2

Es ist vollkommen syntaktisch gültig, eine Klasse als abstrakt zu definieren, wenn sie keine abstrakten Methoden hat. Ich stimme nicht ab, aber diese Antwort ist sachlich falsch. Beachten Sie, dass die Sprache für die Frage Java und nicht C++ ist. – CPerkins

+0

@CPerkins - Ich sage das, indem ich sage "nicht umgekehrt". – fastcodejava

+0

Und du liegst immer noch falsch. Wenn eine Klasse den 'abstrakten' Modifikator hat, ist sie per Definition abstrakt, ob sie abstrakte Methoden hat oder nicht. – EJP

Verwandte Themen