2009-08-03 15 views
26

Warum werden abstrakte oder Interface-Klassen erstellt oder wann sollten wir abstrakte oder Interface-Klassen verwenden?Wann abstrakte Klasse oder Schnittstelle zu verwenden?

+1

möglich Duplikat von [Java abstrakte Klasse und Schnittstelle] (http://stackoverflow.com/questions/5094825/java-abstract-class-and-interface) – duffymo

+1

http://stackoverflow.com/questions/761194/interface -vs-abstract-class-general-oo –

+0

https://stackoverflow.com/questions/479142/when-zu-use-an-interface-instead-of-abstract-class-and-vice-versa enthält am besten Antworten –

Antwort

37

Die Schnittstelle wird verwendet, wenn Sie nur deklarieren wollen, welche Methoden und Member eine Klasse haben MUSS. Jeder, der die Schnittstelle implementiert, muss die von der Schnittstelle aufgelisteten Methoden deklarieren und implementieren.

Wenn Sie auch eine Standardimplementierung verwenden möchten, verwenden Sie die abstrakte Klasse. Jede Klasse, die die abstrakte Klasse erweitert, muss nur ihre abstrakten Methoden und Member implementieren und wird eine Standardimplementierung der anderen Methoden der abstrakten Klasse haben, die Sie überschreiben können oder nicht.

--edit - vergaß zu erwähnen, Earwicker erinnerte mich

Schließlich können Sie so viele Schnittstellen implementieren, wie Sie wollen, aber nur eine Klasse erweitern (es abstrakt ist oder nicht). Denken Sie daran, bevor Sie wählen.

+2

Das ist nicht der grundlegende Unterschied - Sie können eine abstract Klasse erstellen, die nur abstrakte Methoden hat. –

+1

In diesem Fall, warum nicht eine Schnittstelle verwenden? –

+0

Ich habe die Sprache nicht entworfen! :) Sie könnten theoretisch einige geschützte Datenfelder in der abstrakten Klasse haben, die Sie mit einer Schnittstelle nicht machen konnten. –

11

Eine abstrakte Klasse ist eine Klasse, die einige ihrer Methoden nicht implementiert. Offensichtlich kann es nicht instanziiert werden. Sie müssen von einer abstrakten Klasse erben und die abstrakten Methoden in einer anderen Klasse implementieren.

Schnittstellen sind überhaupt keine Klassen (nennen Sie sie daher nicht Interface-Klasse). Schnittstellen definieren die Signatur von Methoden ohne jegliche Implementierung. Auch Schnittstellen haben keine Member-Felder. Wenn Sie eine Schnittstelle in einer Klasse implementieren, müssen Sie Implementierungen für die von der Schnittstelle bereitgestellten Methoden bereitstellen.

Es ist sinnvoll, eine generalisierte API für einige Dinge zu definieren, die völlig unterschiedliche Implementierungen haben können. Abstrakte Klassen sind nützlicher für Klassen, die hauptsächlich dasselbe tun, aber einige subtile Unterschiede haben. Sie können beide Ansätze kombinieren.

Ein gutes Beispiel ist die collections framework der Java-Klassenbibliothek. Sie haben die Schnittstelle Liste, die definiert, wie sich Listen verhalten müssen. Einige Implementierungen sind zum Beispiel ArrayList und LinkedList. Da sie sich ähnlich verhalten, wird das Zeug, das für beide gleich funktioniert, in der abstrakten Klasse AbstactList implementiert, beide erben dies.

1

Abstrakte Klassen werden beim Erstellen einer Vererbungshierarchie verwendet. Die meisten Vererbungshierarchien sollten jedoch nicht zu "tief" sein (d. H. Zu viele Vererbungsebenen). Viele objektorientierte Designbücher bevorzugen Schnittstellen über die Vererbung (ein Buch, das ich einmal gelesen habe, hat einen Entwickler zitiert, dass "Vererbung die einzige coolste [objektorientierte] Funktion ist, die du nicht implementierst"), da dadurch Klassen Verhalten zugewiesen werden kann. durch Vertrag ", wo der Vertrag die Schnittstelle ist.

Es ist erwähnenswert Samuelcarijos Antwort - wenn Sie eine Standardimplementierung einer Methode haben möchten, müssten Sie eine abstrakte Klasse verwenden, die eine konkrete Implementierung der Methode hat, um ihr eine Standardimplementierung zu geben. Diese Standardimplementierung kann in untergeordneten Klassen überschrieben werden.

Hoffe, das hilft!

2

SamuelCarrijo scheint diese Frage gut beantwortet zu haben.

Zusätzlich zu Java erfordern einige Frameworks eine Schnittstelle zum Arbeiten. Ich denke an (sagen wir) dynamic proxies oder einige Client/Server-Proxy-Frameworks. Dies liegt daran, dass sie eine Introspektion für das Objekt verwenden, um Methoden zu bestimmen, die von den durch das Objekt implementierten Schnittstellen implementiert werden. Daher müssen Sie gelegentlich eine Schnittstelle für ein Objekt implementieren, wo Sie normalerweise nicht stören würden.

Hinweis dieser Grund für Schnittstellen ist Java spezifisch.

15

Der entscheidende Unterschied ist, dass Sie implement mehrere Schnittstellen in einer Klasse, aber nur extend eine einzelne abstrakte Klasse. Dies liegt daran, dass eine abstrakte Klasse auch Felder definieren kann, die Daten speichern, während dies bei einer Schnittstelle nicht möglich ist.

+0

Guter Punkt! Daran hatte ich mich nicht erinnert. Java (wie C#) erlaubt keine Mehrfachvererbung von Klassen, erlaubt aber die Implementierung von beliebig vielen Schnittstellen. –

+0

tatsächlich können Sie auch Felder in einer Schnittstelle haben, aber nur wenn sie statisch und final sind – FearlessHyena

3

Siehe Schnittstelle ist im Grunde ein "Vertrag". Wenn Sie eine Schnittstelle definieren, definieren Sie einen Vertrag. Wo abstrakte Klassen erweitert werden, werden Schnittstellen implementiert.

Betrachten wir ein Beispiel.

public interface Friend { 
void hello(); 
} 

Jetzt haben Sie einen Vertrag definiert, die besagt, dass jede Klasse, die Friend bereitstellen muss eine Definition für Verfahren hello() implementieren möchte. Hier

ist eine Implementierung:

public class myFriend implements Friend { 
public void hello() 
println("Done"); 
} 

Jetzt myFriend hat den Vertrag erfüllt. Jetzt stellt sich die Frage: Wo sollen Interfaces verwendet werden?

Schnittstellen helfen Ihnen, ein Verhalten zu definieren, das implementiert werden muss. Angenommen, Sie haben eine Klasse A, die einige Funktionen definiert. Sie möchten, dass andere Klassen diese Klassenfunktion nur verwenden sollen, wenn sie ein bestimmtes Verhalten (Methoden) definieren. Sie erzwingen diese Einschränkung in Bezug auf die Schnittstelle.

Verwandte Themen