Frage Was ist der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?


Was genau ist der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?


1468
2017-12-16 08:15


Ursprung


Antworten:


Schnittstellen

Eine Schnittstelle ist ein Vertrag: Die Person, die die Schnittstelle schreibt, sagt: "Hey, ich akzeptiere Dinge, die so aussehen"und die Person, die die Schnittstelle verwendet, sagt"OK, die Klasse, die ich schreibe, sieht so aus".

Eine Schnittstelle ist eine leere Shell. Es gibt nur die Signaturen der Methoden, was impliziert, dass die Methoden keinen Körper haben. Die Schnittstelle kann nichts tun. Es ist nur ein Muster.

Zum Beispiel (Pseudocode):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }


    int getFuel()
    {
        return this.fuel;
    }
}

Das Implementieren einer Schnittstelle verbraucht sehr wenig CPU, da es sich nicht um eine Klasse handelt, sondern nur um eine Reihe von Namen, und daher gibt es keine kostspielige Nachschau. Es ist großartig, wenn es darauf ankommt, beispielsweise in eingebetteten Geräten.


Abstrakte Klassen

Abstrakte Klassen sind im Gegensatz zu Interfaces Klassen. Sie sind teurer zu verwenden, da es eine Nachschlagefunktion gibt, wenn Sie von ihnen erben.

Abstrakte Klassen sehen ähnlich wie Schnittstellen aus, aber sie haben etwas mehr: Sie können ein Verhalten für sie definieren. Es geht mehr um eine Person, die sagt: "Diese Klassen sollten so aussehen, und sie haben das gemeinsam, also füllen Sie die Lücken aus!".

Beispielsweise:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Implementierung

Während abstrakte Klassen und Schnittstellen unterschiedliche Konzepte sein sollten, machen die Implementierungen diese Aussage manchmal falsch. Manchmal sind sie nicht einmal das, was du denkst.

In Java wird diese Regel stark erzwungen, während in PHP Interfaces abstrakte Klassen sind, für die keine Methode deklariert ist.

In Python sind abstrakte Klassen mehr ein Programmiertrick, den Sie aus dem ABC-Modul erhalten können, und verwendet tatsächlich Metaklassen und damit Klassen. Und Interfaces haben mehr mit der Eingabe von Enten in dieser Sprache zu tun und es ist eine Mischung aus Konventionen und speziellen Methoden, die Deskriptoren aufrufen (Methoden __method__).

Wie bei der Programmierung üblich, gibt es Theorie, Praxis und Praxis in einer anderen Sprache :-)


1966
2017-12-16 08:37



Die wichtigsten technischen Unterschiede zwischen einem abstrakte Klasse und ein Schnittstelle sind:

  • Abstrakte Klassen können haben Konstanten, Member, Methodenstubs (Methoden ohne Body) und definierte Methoden, während Schnittstellen nur haben können Konstanten und Methoden Stubs.

  • Methoden und Member einer abstrakten Klasse können mit definiert werden jede Sichtbarkeit, während alle Methoden einer Schnittstelle als definiert sein müssen public (Sie sind standardmäßig als öffentlich definiert).

  • Beim Erben einer abstrakten Klasse a Beton Kinderklasse muss die abstrakten Methoden definieren, während eine abstrakte Klasse eine andere abstrakte Klasse erweitern kann und abstrakte Methoden von der übergeordneten Klasse nicht definiert werden müssen.

  • Ähnlich ist eine Schnittstelle, die eine andere Schnittstelle erweitert nicht verantwortlich für die Implementierung von Methodenvon der Elternschnittstelle. Dies liegt daran, dass Schnittstellen keine Implementierung definieren können.

  • Eine Kindklasse kann nur eine einzelne Klasse erweitern (abstrakt oder konkret), während eine Schnittstelle sich erweitern kann oder eine Klasse kann implementieren Sie mehrere andere Schnittstellen.

  • Eine Kindklasse kann abstrakte Methoden mit dem definieren gleiche oder weniger restriktive Sichtbarkeit, während eine Klasse, die eine Schnittstelle implementiert, die Methoden mit derselben Sichtbarkeit definieren muss (public).


749
2017-12-16 10:11



Eine Schnittstelle enthält nur die Definition / Signatur der Funktionalität, und wenn wir eine gemeinsame Funktionalität sowie gemeinsame Signaturen haben, müssen wir eine abstrakte Klasse verwenden. Durch die Verwendung einer abstrakten Klasse können sowohl Verhalten als auch Funktionalität gleichzeitig bereitgestellt werden. Ein anderer Entwickler, der eine abstrakte Klasse erbt, kann diese Funktionalität leicht verwenden, da er nur die Leerzeichen ausfüllen muss.

enter image description here

Genommen von:

http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html

http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html


108
2017-09-15 08:59



Eine Erklärung finden Sie hier: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Eine abstrakte Klasse ist eine Klasse, die ist   nur teilweise umgesetzt von der   Programmierer. Es kann einen oder mehrere enthalten   abstrakte Methoden. Eine abstrakte Methode   ist einfach eine Funktionsdefinition, die   dient dazu, dem Programmierer zu sagen, dass der   Methode muss in einem Kind implementiert werden   Klasse.

Eine Schnittstelle ähnelt einer Zusammenfassung   Klasse; in der Tat besetzen Schnittstellen die   gleicher Namespace wie Klassen und Abstract   Klassen. Aus diesem Grund können Sie nicht   Definieren Sie eine Schnittstelle mit demselben Namen   als eine Klasse. Eine Schnittstelle ist eine vollständige   abstrakte Klasse; keine seiner Methoden   sind implementiert und statt einer Klasse   Unterklassierung von ihm, es wird gesagt   implementieren diese Schnittstelle.

Jedenfalls finde ich diese Erklärung der Schnittstellen etwas verwirrend. Eine häufigere Definition ist: Eine Schnittstelle definiert einen Vertrag, den implementierende Klassen erfüllen müssen. Eine Schnittstellendefinition besteht aus Signaturen von öffentlichen Mitgliedern ohne jeden Implementierungscode.


76
2017-12-16 08:18



Einige wichtige Unterschiede:

In Form einer Tabelle:

Difference

Wie erklärt von Joe von javapapers:

1. Hauptunterschied ist, dass Methoden einer Java-Schnittstelle implizit abstrakt sind und keine Implementierungen haben können. Eine Java-abstrakte Klasse kann   haben Instanzmethoden, die ein Standardverhalten implementieren.

2.Variablen, die in einer Java-Schnittstelle deklariert sind, sind standardmäßig endgültig. Eine abstrakte Klasse kann nicht endgültige Variablen enthalten.

3. Mitglieder einer Java-Schnittstelle sind standardmäßig öffentlich. Eine Java-abstrakte Klasse kann die üblichen Aromen von Klassenmitgliedern wie private,   geschützt, etc ..

4. Java-Schnittstelle sollte mit dem Schlüsselwort "implementiert" implementiert werden; Eine Java-Abstract-Klasse sollte mit dem Schlüsselwort "extends" erweitert werden.

5. Eine Schnittstelle kann nur eine andere Java-Schnittstelle erweitern, eine abstrakte Klasse kann eine andere Java-Klasse erweitern und mehrere Java implementieren   Schnittstellen.

6. Eine Java-Klasse kann mehrere Schnittstellen implementieren, sie kann jedoch nur eine abstrakte Klasse erweitern.

7. Interface ist absolut abstrakt und kann nicht instanziiert werden; Eine Java-abstrakte Klasse kann auch nicht instanziiert werden, kann aber aufgerufen werden, wenn a   main () existiert.

8.Im Vergleich zu Java-abstrakten Klassen sind Java-Schnittstellen langsam, da sie eine zusätzliche Indirektion erfordern.


36
2018-05-16 05:55



Ich möchte die Unterschiede nicht hervorheben, die bereits in vielen Antworten erwähnt wurden (bezüglich öffentlicher statischer Endmodifikatoren für Variablen in der Schnittstelle und Unterstützung für geschützte, private Methoden in abstrakten Klassen).

In einfachen Worten möchte ich sagen:

Schnittstelle: Um einen Vertrag durch mehrere nicht verwandte Objekte zu implementieren

abstrakte Klasse: Um das gleiche oder ein anderes Verhalten zwischen mehreren verwandten Objekten zu implementieren

Aus dem Orakel Dokumentation

Erwägen Sie die Verwendung abstrakter Klassen ob :

  1. Sie möchten Code zwischen mehreren eng verwandten Klassen freigeben.
  2. Sie erwarten, dass Klassen, die Ihre abstrakte Klasse erweitern, viele gebräuchliche Methoden oder Felder aufweisen oder Zugriffsmodifizierer erfordern, die nicht öffentlich sind (z. B. "geschützt" und "privat").
  3. Sie möchten nicht statische oder nicht endgültige Felder deklarieren.

Erwägen Sie die Verwendung von Schnittstellen ob :

  1. Sie erwarten, dass nicht verwandte Klassen Ihre Schnittstelle implementieren. Zum Beispiel können viele nicht verwandte Objekte implementiert werden Serializable Schnittstelle.
  2. Sie möchten das Verhalten eines bestimmten Datentyps angeben, aber nicht darauf achten, wer sein Verhalten implementiert.
  3. Sie möchten die mehrfache Vererbung von Typ ausnutzen.

abstrakte Klasse stellt fest, "ist eine" Beziehung zu konkreten Klassen. Schnittstelle bietet "hat eine" Fähigkeit für Klassen.

Wenn Sie suchen Java als Programmiersprache gibt es noch ein paar Updates:

Java 8 hat die Lücke zwischen interface und abstract Klassen bis zu einem gewissen Grad durch Bereitstellung eines default Methodenfunktion. Eine Schnittstelle hat keine Implementierung für eine Methode ist jetzt nicht mehr gültig.

Siehe diese Dokumentation Seite für mehr Details.

Sehen Sie sich diese SE-Frage für Codebeispiele an, um sie besser zu verstehen.

Wie hätte ich den Unterschied zwischen einer Interface- und einer Abstract-Klasse erklären sollen?


34
2017-11-27 12:42



Der wichtigste Punkt ist, dass:

  • Abstract ist objektorientiert. Es bietet die grundlegenden Daten, die ein 'Objekt' haben sollte und / oder Funktionen, die es ausführen sollte. Es geht um die grundlegenden Eigenschaften des Objekts: was es hat und was es kann. Daher teilen Objekte, die von derselben abstrakten Klasse erben, die grundlegenden Eigenschaften (Generalisierung).
  • Schnittstelle ist funktional orientiert. Es definiert Funktionalitäten, die ein Objekt haben sollte. Unabhängig davon, welches Objekt es ist, solange es diese Funktionalitäten, die in der Schnittstelle definiert sind, kann, ist es in Ordnung. Es ignoriert alles andere. Ein Objekt / eine Klasse kann mehrere (Gruppen von) Funktionalitäten enthalten; Daher ist es für eine Klasse möglich, mehrere Schnittstellen zu implementieren.

22
2017-09-29 09:54