2008-10-27 19 views
18

Was ist die genaue Verwendung einer abstrakten Klasse? Ist es nicht möglich, in einer gewöhnlichen Klasse die gleichen Dinge zu tun wie in einer abstrakten Klasse?Exakte Verwendung der abstrakten Klasse

+0

Siehe: http://stackoverflow.com/questions/56867/interface-vs-base-class –

+0

Werfen Sie einen Blick auf [Template Method Design Pattern] (http://sourcemaking.com/design_patterns/template_method) Ich denke abstrakte Klasse ist dort nicht ersetzbar. – rafek

Antwort

19

Eine abstrakte Klasse wird verwendet, wenn Sie einige Basisfunktionen, die Sie Subklassen erben wollen, aber es wäre nicht sinnvoll, die Basisklasse zu instanziieren. Wenn Sie beispielsweise eine Shape-Basisklasse haben, könnten Sie über eine eingebaute Implementierung verfügen, die von Unterklassen verwendet werden kann, sowie über Schnittstellenmethoden, die von den Unterklassen implementiert werden sollen. Es wäre jedoch wahrscheinlich nicht sinnvoll, ein Shape-Objekt zu erstellen. Eine abstrakte Klasse gibt Ihnen diese Funktionalität. Ein weiteres großartiges Beispiel für abstrakte Klassenanwendungen ist die abstract factory pattern.

24

Verwenden Sie eine abstrakte Klasse, um eine konkrete Implementierung bereitzustellen, die Instanziierung jedoch nicht zuzulassen. Sie können immer eine gewöhnliche Klasse instanziieren, die keinen Sinn ergibt, wenn sie nicht alleine stehen kann. Gleichzeitig ist eine Schnittstelle möglicherweise nicht ausreichend, wenn es eine konkrete Implementierung gibt, die in allen implementierenden Klassen identisch ist. Eine abstrakte Klasse ist gerade genug.

  • Schnittstelle: Vertrag nur, keine Implementierung, keine Instantiierung
  • Abstrakte Klasse: Vertrag, einige Implementierung, keine Instantiierung
  • Klasse: Vertrag, Implementierung, Instanziierung
+0

wie es möglich ist, Vertrag in der dritten, Klasse. weil Vertrag bedeutet die Deklaration dieser Methode, das heißt "abstrakt". Und der Compiler zwingt zur Umwandlung in die abstrakte Klasse Deshalb ist es möglich, in der normalen Klasse zu kontrahieren. Wenn meine Logik falsch ist, bitte mich richtig. – devsda

1

Im Gegensatz zu normalen Klassen, abstract Klassen können abstract Methoden enthalten. Sie verhalten sich ähnlich wie Interface-Mitglieder.

der Zwischenzeit können sie so ziemlich alles andere tun, dass regelmäßige Klassen tun können: sie können Methoden implementieren, enthalten Felder & verschachtelte Typen, von einer anderen Klasse abgeleitet sind, usw.

5

Reguläre Klassen, die Sie benötigen Implementierungen für alle zu schaffen, Methoden.
Schnittstellen erfordern Sie nicht bieten alle Implementierungen für alle Methoden.

Abstrakte Klassen sind der einzige Klassen-Typ, der es Ihnen ermöglicht, Methoden zu verwenden, die eine Implementierung enthalten, und Methoden zu verwenden, die keine Implementierung bereitstellen, aber eine vererbende Klasse benötigen.

Die Tatsache, dass Sie Methoden ohne Implementierung hinzufügen dürfen ist der Grund, warum Sie nicht eine abstrakte Klasse instanziiert können: Sie können nur etwas instanziiert, die Implementierungen für alle Methoden hat.

Verwandte Themen