Wann sollten abstrakte Klassen verwendet werden?


77

Hier ist der MSDN-Artikel über abstrakte Klassen , aber ich verstehe ihn wirklich nicht ...

Wann sollte ich wirklich abstrakte Klassen verwenden? Was sind die Vorteile der Verwendung von abstrakten Klassen?


Der MSDN-Artikel über abstrakte Klassen ist ernsthaft ein Witz, es ist traurig.
Yusha

Antworten:


140

Abstrakte Klassen sind nützlich, wenn Sie eine Klasse zum Zwecke der Vererbung und des Polymorphismus benötigen. Es ist jedoch nicht sinnvoll, die Klasse selbst zu instanziieren, sondern nur ihre Unterklassen. Sie werden häufig verwendet, wenn Sie eine Vorlage für eine Gruppe von Unterklassen definieren möchten, die einen gemeinsamen Implementierungscode verwenden, aber auch sicherstellen möchten, dass die Objekte der Oberklasse nicht erstellt werden können.

Angenommen, Sie müssen Objekte für Hunde, Katzen, Hamster und Fische erstellen. Sie besitzen ähnliche Eigenschaften wie Farbe, Größe und Anzahl der Beine sowie Verhalten, sodass Sie eine Tier-Superklasse erstellen. Welche Farbe hat ein Tier? Wie viele Beine hat ein Tierobjekt? In diesem Fall ist es nicht sehr sinnvoll, ein Objekt vom Typ Animal zu instanziieren, sondern nur seine Unterklassen.

Abstrakte Klassen haben auch den zusätzlichen Vorteil des Polymorphismus: Sie können den Typ der (abstrakten) Oberklasse als Methodenargument oder als Rückgabetyp verwenden. Wenn Sie beispielsweise eine PetOwner-Klasse mit einer train () -Methode hatten, können Sie diese so definieren, dass sie ein Objekt vom Typ Animal aufnimmt, z. B. train (Animal a), anstatt für jeden Subtyp von Animal eine Methode zu erstellen.


15
Das Tier würde den Bedarf an Farbe, Anzahl der Beine und Größeneigenschaften definieren. Wenn ich also Katze als Tier anspreche, erwarte ich inständig, dass das Tier eine Farbe, Anzahl der Beine und Größe hat. Ich denke auch, dass Sie diese Eigenschaften in der Basisklasse rechtmäßig implementieren könnten, da dies sonst zu doppeltem Code führen würde. Die Beschreibungen hier sind eher von Eigenschaften als von Methoden abhängig. Es hätte keinen Sinn, wenn Animal eine "Move" -Methode implementiert, da jedes Tier möglicherweise eine andere Fortbewegungsmethode hat, aber die Notwendigkeit einer "Move" -Methode definiert. Methode.
Lazarus

Die folgende Antwort half mir auch zu verstehen, was eine abstrakte Klasse ist stackoverflow.com/a/2558588/2188550
Ivanzinho

Wir sollten Super Class nicht als Rückgabetyp verwenden, da es weniger spezifisch ist und dies eine schlechte Praxis ist. Der Rückgabetyp sollte spezifischer sein. Wenn Cat der Rückgabetyp ist, sollte Animal nicht als Rückgabetyp verwendet werden.
Ashish Kumar Jaryal

6

Durch die Verwendung abstrakter Klassen können wir die Klasse allgemeiner gestalten.

Beispiel: Wenn Klasse A eine abstrakte Klasse ist und es Klassen Klasse B, Klasse C und Klasse D gibt, die die abstrakte Klasse A erweitern, erben diese Unterklassen eine Methode, die bereits in der abstrakten Klasse A deklariert ist, wodurch die Methode allgemeiner wird.


4

Sie verwenden sie für Klassen, die niemals erstellt werden (so effektiv nicht existieren), aber Sie möchten aus Gründen des Polymorphismus von ihnen erben.


3

Verwenden Sie abstrakte Klassen, wenn Sie ein Verhalten für eine Klasse in Ihrer Klassenhierarchie definieren, das niemals zum direkten Instanziieren eines Objekts verwendet wird.

Betrachten Sie sich für einen Moment als Gott. Ihre CBabyBoy- und CBanyGirl-Klassen wären nicht abstrakt, da dies feste Objekte sind, die erstellt werden. Auf der anderen Seite wären Ihre CPerson- und CAnimal-Klassen abstrakt - sie sind aus Sicht der Typhierarchie nützlich, aber Sie werden nie ausgeführtCAnimal dingbat = new Animal();


3

Richard hat ein Beispiel geliefert, bei dem eine abstrakte Klasse Vorteile gegenüber nicht abstrakten Klassen hat.

Ich möchte eine Faktentabelle hinzufügen, um zwischen einer abstrakten Klasse und einer Schnittstelle zu wählen. Das Bild finden Sie hier .

Geben Sie hier die Bildbeschreibung ein


2

Grundsätzlich sollten Sie eine abstrakte Klasse verwenden, wenn eine Entität in Ihrer Hierarchie logischerweise über Methoden verfügt, die nicht implementiert werden können, die Nachkommen jedoch. Es gibt Milliarden von "echten" Beispielen im ganzen Web, wirklich)


3
Anstatt "weiß nicht", sollte das wirklich "kann nicht oder sollte nicht" sein. Selbst im Beispiel für ein grundlegendes Shape-Objekt könnte die Zeichenmethode als leere Methode implementiert werden. Sollte dies jedoch der Fall sein?
Lazarus

Interessante Sichtweise) Aber ich meine, diese leere Implementierung zählt natürlich nicht =)
n535
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.