Frage

Schnittstellen ermöglichen es Ihnen, Code zu erstellen, der die Methoden der Klassen definiert, die ihn implementieren.Sie können diesen Methoden jedoch keinen Code hinzufügen.

Abstrakte Klassen ermöglichen Ihnen, das Gleiche zu tun und der Methode Code hinzuzufügen.

Wenn man nun mit abstrakten Klassen das gleiche Ziel erreichen kann, warum brauchen wir dann überhaupt das Konzept der Schnittstellen?

Mir wurde gesagt, dass es mit der OO-Theorie von C++ bis Java zu tun hat, auf der das OO-Zeug von PHP basiert.Ist das Konzept in Java nützlich, aber nicht in PHP?Ist es nur eine Möglichkeit, zu verhindern, dass Platzhalter in der abstrakten Klasse verstreut sind?Vermisse ich etwas?

War es hilfreich?

Lösung

Der Sinn von Schnittstellen besteht darin, Ihnen die Flexibilität zu geben, Ihre Klasse zur Implementierung mehrerer Schnittstellen zu zwingen, aber dennoch keine Mehrfachvererbung zuzulassen.Die Probleme beim Erben von mehreren Klassen sind vielfältig und vielfältig Wikipedia Die Seite darüber fasst sie ziemlich gut zusammen.

Schnittstellen sind ein Kompromiss.Die meisten Probleme mit der Mehrfachvererbung gelten nicht für abstrakte Basisklassen. Daher deaktivieren die meisten modernen Sprachen heutzutage die Mehrfachvererbung, rufen jedoch Schnittstellen für abstrakte Basisklassen auf und ermöglichen einer Klasse, so viele davon zu „implementieren“, wie sie möchten.

Andere Tipps

Das Konzept ist in der objektorientierten Programmierung rundum nützlich.Für mich ist eine Schnittstelle ein Vertrag.Solange meine Klasse und Ihre Klasse sich auf diesen Methodensignaturvertrag einigen, können wir eine „Schnittstelle“ herstellen.Bei den abstrakten Klassen handelt es sich meiner Meinung nach eher um Basisklassen, die einige Methoden überflüssig machen, und ich muss die Details ausfüllen.

Warum brauchen Sie eine Schnittstelle, wenn es bereits abstrakte Klassen gibt?Um Mehrfachvererbung zu verhindern (kann mehrere bekannte Probleme verursachen).

Eines dieser Probleme:

Das "Diamantproblem" (manchmal als "tödlicher Diamant des Todes" bezeichnet) ist eine Unklarheit, die entsteht, wenn zwei Klassen B und C von A und Klasse D sowohl B als auch C erbtWenn es eine Methode in A gibt, die B und C überschrieben haben und D sie nicht überschreibt, ist welche Version der Methode D erben wird:das von B oder das von C?

Quelle: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

Warum/wann sollte eine Schnittstelle verwendet werden?Ein Beispiel...Alle Autos auf der Welt haben die gleiche Schnittstelle (Methoden) ... AccelerationPedalIsOnTheRight(), BrakePedalISOnTheLeft().Stellen Sie sich vor, dass jede Automarke über diese „Methoden“ verfügt, die sich von denen einer anderen Marke unterscheiden.BMW hätte die Bremsen auf der rechten Seite und Honda hätte Bremsen auf der linken Seite des Rades.Die Leute müssten jedes Mal lernen, wie diese „Methoden“ funktionieren, wenn sie eine andere Automarke kaufen würden.Aus diesem Grund ist es eine gute Idee, an mehreren „Orten“ dieselbe Schnittstelle zu haben.

Was macht eine Schnittstelle für Sie (warum sollte jemand überhaupt eine verwenden)?Eine Schnittstelle verhindert, dass Sie „Fehler“ machen (sie stellt sicher, dass alle Klassen, die eine bestimmte Schnittstelle implementieren, alle über die Methoden verfügen, die in der Schnittstelle enthalten sind).

// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{   
    public function Create($personObject);
}

class MySqlPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Create a new person in MySql database.
    }
}

class MongoPerson implements IPersonService
{
    public function Create($personObject)
    {
        // Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
    }
}

Auf diese Weise wird die Create() Die Methode wird immer auf die gleiche Weise verwendet.Es spielt keine Rolle, ob wir das verwenden MySqlPerson Klasse oder die MongoPerson Klasse.Die Art und Weise, wie wir eine Methode verwenden, bleibt gleich (die Schnittstelle bleibt gleich).

Es wird zum Beispiel so verwendet (überall in unserem Code):

new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);

So kann so etwas nicht passieren:

new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);

Es ist viel einfacher, sich eine Schnittstelle zu merken und überall dieselbe zu verwenden, als mehrere verschiedene.

Auf diese Weise wird das Innere des Create() Die Methode kann für verschiedene Klassen unterschiedlich sein, ohne dass sich dies auf den „externen“ Code auswirkt, der diese Methode aufruft.Alles, was der externe Code wissen muss, ist die Methode Create() hat 1 Parameter ($personObject), da der externe Code die Methode auf diese Weise verwendet/aufruft.Dem externen Code ist es egal, was innerhalb der Methode passiert.Es muss nur wissen, wie es verwendet/aufgerufen wird.

Sie können dies auch ohne Schnittstelle tun, aber wenn Sie eine Schnittstelle verwenden, ist es „sicherer“ (weil es Sie vor Fehlern schützt).Die Schnittstelle stellt Ihnen sicher, dass die Methode Create() hat in allen Klassen, die die Schnittstelle implementieren, die gleiche Signatur (gleiche Typen und gleiche Anzahl von Parametern).Auf diese Weise können Sie sicher sein, dass JEDE Klasse, die das implementiert IPersonService Schnittstelle, wird die Methode haben Create() (in diesem Beispiel) und benötigt nur 1 Parameter ($personObject), um angerufen/benutzt zu werden.

Eine Klasse, die eine Schnittstelle implementiert, muss alle Methoden implementieren, die die Schnittstelle ausführt/hat.

Ich hoffe, dass ich mich nicht zu oft wiederholt habe.

Der Unterschied zwischen der Verwendung einer Schnittstelle und einer abstrakten Klasse hat für mich mehr mit der Codeorganisation zu tun als mit der Durchsetzung durch die Sprache selbst.Ich verwende sie häufig, wenn ich Code für die Arbeit anderer Entwickler vorbereite, damit sie innerhalb der beabsichtigten Entwurfsmuster bleiben.Schnittstellen sind eine Art „Design by Contract“, bei dem Ihr Code zustimmt, auf eine vorgeschriebene Reihe von API-Aufrufen zu reagieren, die möglicherweise von Code stammen, auf den Sie keinen Zugriff haben.

Während die Vererbung von einer abstrakten Klasse eine „ist ein“-Beziehung ist, ist das nicht immer das, was Sie wollen, und die Implementierung einer Schnittstelle ist eher eine „verhält sich wie ein“-Beziehung.Dieser Unterschied kann in bestimmten Kontexten sehr erheblich sein.

Nehmen wir zum Beispiel an, Sie haben eine abstrakte Klasse „Konto“, aus der viele andere Klassen hervorgehen (Kontotypen usw.).Es verfügt über einen bestimmten Satz von Methoden, die nur auf diese Typgruppe anwendbar sind.Einige dieser Kontounterklassen implementieren jedoch Versionable, Listable oder Editable, sodass sie in Controller geworfen werden können, die diese APIs verwenden sollen.Dem Controller ist es egal, um welche Art von Objekt es sich handelt

Im Gegensatz dazu kann ich auch ein Objekt erstellen, das nicht über „Account“ hinausgeht, beispielsweise eine abstrakte Benutzerklasse, und trotzdem „Listable“ und „Editable“, aber nicht „Versionable“ implementieren, was hier keinen Sinn ergibt.

Auf diese Weise sage ich, dass die FooUser-Unterklasse KEIN Konto ist, sondern sich wie ein bearbeitbares Objekt verhält.Ebenso erweitert sich BarAccount von Account, ist aber keine User-Unterklasse, sondern implementiert Editable, Listable und auch Versionable.

Das Hinzufügen all dieser APIs für Editable, Listable und Versionable zu den abstrakten Klassen selbst wäre nicht nur unübersichtlich und hässlich, sondern würde auch entweder die gemeinsamen Schnittstellen in Account und User duplizieren oder mein User-Objekt zwingen, Versionable zu implementieren, wahrscheinlich nur, um ein auszulösen Ausnahme.

Schnittstellen sind im Wesentlichen eine Blaupause für das, was Sie erstellen können.Sie definieren, welche Methoden eine Klasse hat haben müssen, aber Sie können außerhalb dieser Einschränkungen zusätzliche Methoden erstellen.

Ich bin mir nicht sicher, was Sie damit meinen, dass Sie keinen Code zu Methoden hinzufügen können – weil Sie das können.Wenden Sie die Schnittstelle auf eine abstrakte Klasse oder die Klasse an, die sie erweitert?

Eine Methode in der Schnittstelle, die auf die abstrakte Klasse angewendet wird, muss in dieser abstrakten Klasse implementiert werden.Wenden Sie diese Schnittstelle jedoch auf die Erweiterungsklasse an, und die Methode muss nur in der Erweiterungsklasse implementiert werden.Ich könnte mich hier irren – ich verwende Schnittstellen nicht so oft, wie ich könnte/sollte.

Ich habe Schnittstellen immer als Muster für externe Entwickler oder als zusätzlichen Regelsatz betrachtet, um sicherzustellen, dass die Dinge korrekt sind.

Sie werden Schnittstellen in PHP verwenden:

  1. Um die Implementierung auszublenden, erstellen Sie ein Zugriffsprotokoll für eine Objektklasse und ändern Sie die zugrunde liegende Implementierung, ohne an allen Stellen, an denen Sie diese Objekte verwendet haben, ein Refactoring durchzuführen
  2. Um den Typ zu überprüfen, wird beispielsweise sichergestellt, dass ein Parameter einen bestimmten Typ hat $object instanceof MyInterface
  3. Um die Parameterprüfung zur Laufzeit zu erzwingen
  4. Um mehrere Verhaltensweisen in einer einzigen Klasse zu implementieren (komplexe Typen erstellen)

    Klasse Auto implementiert EngineInterface, BodyInterface, SteeringInterface {

so dass a Car Objekt ca. jetzt start(), stop() (EngineInterface) oder goRight(),goLeft() (Lenkschnittstelle)

und andere Dinge, die mir im Moment nicht einfallen

Nummer 4 ist wahrscheinlich der offensichtlichste Anwendungsfall, den Sie nicht mit abstrakten Klassen ansprechen können.

Aus dem Denken in Java:

In einer Schnittstelle heißt es: "So werden alle Klassen, die diese bestimmte Schnittstelle implementieren, aussehen." Daher weiß jeder Code, der eine bestimmte Schnittstelle verwendet, welche Methoden für diese Schnittstelle aufgefordert werden können, und das ist alles.Die Schnittstelle wird also verwendet, um ein „Protokoll“ zwischen Klassen einzurichten.

Schnittstellen dienen nicht als Grundlage für die Erweiterung von Klassen, sondern als Abbildung erforderlicher Funktionen.

Das Folgende ist ein Beispiel für die Verwendung einer Schnittstelle, bei der eine abstrakte Klasse nicht passt:
Nehmen wir an, ich habe eine Kalenderanwendung, mit der Benutzer Kalenderdaten aus externen Quellen importieren können.Ich würde Klassen schreiben, um den Import jedes Datenquellentyps (ical, rss, atom, json) zu handhaben. Jede dieser Klassen würde eine gemeinsame Schnittstelle implementieren, die sicherstellt, dass sie alle über die gemeinsamen öffentlichen Methoden verfügen, die meine Anwendung zum Abrufen der Daten benötigt.

<?php

interface ImportableFeed 
{
    public function getEvents();
}

Wenn ein Benutzer dann einen neuen Feed hinzufügt, kann ich die Art des Feeds identifizieren und die für diesen Typ entwickelte Klasse verwenden, um die Daten zu importieren.Jede Klasse, die zum Importieren von Daten für einen bestimmten Feed geschrieben wurde, hätte einen völlig anderen Code. Ansonsten gäbe es möglicherweise nur sehr wenige Ähnlichkeiten zwischen den Klassen, abgesehen von der Tatsache, dass sie die Schnittstelle implementieren müssen, die es meiner Anwendung ermöglicht, sie zu nutzen.Wenn ich eine abstrakte Klasse verwenden würde, könnte ich die Tatsache sehr leicht ignorieren, dass ich die Methode getEvents() nicht überschrieben habe, was dann meine Anwendung in diesem Fall beschädigen würde, während die Verwendung einer Schnittstelle meine App nicht laufen lassen würde, wenn EINE der Methoden vorhanden wäre In der Schnittstelle definierte Elemente sind in der Klasse, die sie implementiert hat, nicht vorhanden.Meine App muss sich nicht darum kümmern, welche Klasse sie verwendet, um Daten aus einem Feed abzurufen, sondern nur darum, dass die Methoden vorhanden sind, die sie zum Abrufen dieser Daten benötigt.

Um noch einen Schritt weiter zu gehen: Die Benutzeroberfläche erweist sich als äußerst nützlich, wenn ich zu meiner Kalender-App zurückkehre, um einen weiteren Feed-Typ hinzuzufügen.Wenn ich die ImportableFeed-Schnittstelle verwende, kann ich weitere Klassen hinzufügen, die verschiedene Feed-Typen importieren, indem ich einfach neue Klassen hinzufüge, die diese Schnittstelle implementieren.Dadurch kann ich jede Menge Funktionalität hinzufügen, ohne meiner Kernanwendung unnötig viel Volumen hinzufügen zu müssen, da meine Kernanwendung nur darauf angewiesen ist, dass die öffentlichen Methoden verfügbar sind, die die Schnittstelle benötigt, solange meine neuen Feed-Importklassen die ImportableFeed-Schnittstelle implementieren, dann ich Ich weiß, dass ich es einfach an Ort und Stelle fallen lassen und weitermachen kann.

Dies ist nur ein sehr einfacher Anfang.Anschließend kann ich eine weitere Schnittstelle erstellen, die alle meine Kalenderklassen implementieren müssen und die mehr Funktionalität bietet, die speziell auf den Feed-Typ zugeschnitten ist, den die Klasse verarbeitet.Ein weiteres gutes Beispiel wäre eine Methode zur Überprüfung des Feed-Typs usw.

Das geht über die Frage hinaus, aber da ich das obige Beispiel verwendet habe:Schnittstellen bringen ihre eigenen Probleme mit sich, wenn sie auf diese Weise verwendet werden.Ich muss sicherstellen, dass die Ausgabe, die von den implementierten Methoden zurückgegeben wird, mit der Schnittstelle übereinstimmt. Um dies zu erreichen, verwende ich eine IDE, die PHPDoc-Blöcke liest, und füge den Rückgabetyp als Typhinweis in einem PHPDoc-Block der Schnittstelle hinzu, der dann funktioniert in die konkrete Klasse übersetzen, die es implementiert.Meine Klassen, die die Datenausgabe der Klassen konsumieren, die diese Schnittstelle implementieren, wissen dann zumindest, dass sie in diesem Beispiel ein zurückgegebenes Array erwarten:

<?php
interface ImportableFeed 
{
    /**
     * @return array
     */
    public function getEvents();
}

Es gibt nicht viel Raum, um abstrakte Klassen und Schnittstellen zu vergleichen.Schnittstellen sind einfach Zuordnungen, die bei der Implementierung erfordern, dass die Klasse über eine Reihe öffentlicher Schnittstellen verfügt.

Schnittstellen dienen nicht nur dazu, sicherzustellen, dass Entwickler bestimmte Methoden implementieren.Da diese Klassen garantiert über bestimmte Methoden verfügen, besteht die Idee darin, dass Sie diese Methoden auch dann verwenden können, wenn Sie den tatsächlichen Typ der Klasse nicht kennen.Beispiel:

interface Readable {
  String read();
}

List<Readable> readables; // dunno what these actually are, but we know they have read();
for(Readable reader : readables)
  System.out.println(reader.read());

In vielen Fällen macht es keinen Sinn, eine Basisklasse bereitzustellen, egal ob abstrakt oder nicht, da die Implementierungen sehr unterschiedlich sind und bis auf ein paar Methoden nichts gemeinsam haben.

Dynamisch typisierte Sprachen haben das Konzept des „Duck-Typing“, bei dem Sie keine Schnittstellen benötigen.Sie können davon ausgehen, dass das Objekt über die Methode verfügt, die Sie aufrufen.Dies umgeht das Problem in statisch typisierten Sprachen, in denen Ihr Objekt über eine Methode verfügt (in meinem Beispiel read()), aber die Schnittstelle nicht implementiert.

Meiner Meinung nach sollten Schnittstellen gegenüber nicht-funktionalen abstrakten Klassen bevorzugt werden.Es würde mich nicht wundern, wenn es dort auch nur einen Leistungseinbruch gäbe, da nur ein Objekt instanziiert wird, anstatt zwei zu analysieren und zu kombinieren (obwohl ich nicht sicher sein kann, da ich mit dem Innenleben nicht vertraut bin). von OOP PHP).

Es stimmt, dass Schnittstellen weniger nützlich/sinnvoll sind als beispielsweise im Vergleich zu Java.Andererseits wird PHP6 noch mehr Typhinweise einführen, einschließlich Typhinweise für Rückgabewerte.Dies sollte den PHP-Schnittstellen einen gewissen Mehrwert verleihen.

tl;dr:Schnittstellen definieren eine Liste von Methoden, die befolgt werden müssen (denken Sie an API), während eine abstrakte Klasse einige grundlegende/allgemeine Funktionen bereitstellt, die die Unterklassen an spezifische Anforderungen anpassen.

Ich kann mich nicht erinnern, ob sich PHP in dieser Hinsicht unterscheidet, aber in Java können Sie mehrere Schnittstellen implementieren, aber Sie können nicht mehrere abstrakte Klassen erben.Ich gehe davon aus, dass PHP genauso funktioniert.

In PHP können Sie mehrere Schnittstellen anwenden, indem Sie sie durch ein Komma trennen (ich glaube, das finde ich keine saubere Lösung).

Was mehrere abstrakte Klassen betrifft, könnte es mehrere abstrakte Klassen geben, die sich gegenseitig erweitern (ich bin mir auch hier nicht ganz sicher, aber ich glaube, ich habe das schon einmal irgendwo gesehen).Das Einzige, was Sie nicht verlängern können, ist ein Abschlusskurs.

Schnittstellen werden Ihrem Code keine Leistungssteigerungen oder ähnliches bescheren, aber sie können einen großen Beitrag dazu leisten, ihn wartbar zu machen.Es ist wahr, dass eine abstrakte Klasse (oder sogar eine nicht-abstrakte Klasse) verwendet werden kann, um eine Schnittstelle zu Ihrem Code einzurichten, aber richtige Schnittstellen (die Sie mit dem Schlüsselwort definieren und die nur Methodensignaturen enthalten) sind einfach einfacher zu realisieren sortieren und lesen.

Abgesehen davon neige ich dazu, bei der Entscheidung, ob ich eine Schnittstelle anstelle einer Klasse verwende oder nicht, nach eigenem Ermessen zu entscheiden.Manchmal möchte ich Standardmethodenimplementierungen oder Variablen, die allen Unterklassen gemeinsam sind.

Natürlich ist auch der Punkt bezüglich der Implementierung mehrerer Schnittstellen sinnvoll.Wenn Sie über eine Klasse verfügen, die mehrere Schnittstellen implementiert, können Sie ein Objekt dieser Klasse in verschiedenen Typen in derselben Anwendung verwenden.

Die Tatsache, dass sich Ihre Frage auf PHP bezieht, macht die Sache jedoch etwas interessanter.Das Eingeben von Eingaben in Schnittstellen ist in PHP immer noch nicht unbedingt erforderlich, wo Sie praktisch alles in jede Methode einspeisen können, unabhängig von deren Typ.Sie können Methodenparameter statisch eingeben, aber einige davon sind fehlerhaft (String verursacht meiner Meinung nach einige Probleme).Kombinieren Sie dies mit der Tatsache, dass Sie die meisten anderen Referenzen nicht eingeben können und es keinen großen Nutzen hat, zu versuchen, statische Typisierung in PHP zu erzwingen (an dieser Stelle).Und deshalb der Wert von Schnittstellen in PHP, an dieser Stelle ist weitaus geringer als in stärker typisierten Sprachen.Sie haben den Vorteil der Lesbarkeit, aber sonst wenig.Eine Mehrfachimplementierung ist nicht einmal von Vorteil, da Sie die Methoden immer noch deklarieren und ihnen innerhalb des Implementierers Körper geben müssen.

Schnittstellen sind wie Ihre Gene.

Abstrakte Klassen sind wie deine echten Eltern.

Ihre Zwecke sind erblich, aber im Fall abstrakter Klassen und Schnittstellen ist das, was vererbt wird, spezifischer.

Nachfolgend finden Sie die Punkte für die PHP-Schnittstelle

  1. Es wird verwendet, um die erforderliche Anzahl von Methoden in der Klasse zu definieren [wenn Sie HTML laden möchten, sind ID und Name erforderlich, daher umfasst die Schnittstelle in diesem Fall setID und setName].
  2. Die Schnittstelle zwingt die Klasse strikt dazu, alle darin definierten Methoden einzuschließen.
  3. Sie können Methoden nur in einer Schnittstelle mit öffentlicher Zugänglichkeit definieren.
  4. Sie können die Schnittstelle auch wie eine Klasse erweitern.Sie können die Schnittstelle in PHP mit dem Schlüsselwort „Extens“ erweitern.
  5. Erweitern Sie mehrere Schnittstellen.
  6. Sie können nicht zwei Schnittstellen implementieren, wenn beide eine Funktion mit demselben Namen teilen.Es wird ein Fehler ausgegeben.

Beispielcode:

interface test{
    public function A($i);
    public function B($j = 20);
}

class xyz implements test{
    public function A($a){
        echo "CLASS A Value is ".$a;
    }
    public function B($b){
        echo "CLASS B Value is ".$b;
    }
}
$x = new xyz();
echo $x->A(11);
echo "<br/>";
echo $x->B(10);

Wir haben gesehen, dass abstrakte Klassen und Schnittstellen insofern ähnlich sind, als sie abstrakte Methoden bereitstellen, die in den untergeordneten Klassen implementiert werden müssen.Es bestehen jedoch weiterhin folgende Unterschiede:

1. Schnittstellen können abstrakte Methoden und Konstanten enthalten, jedoch keine konkreten Methoden und Variablen.

2.Alle Methoden in der Schnittstelle müssen in der sein öffentlich Sichtbarkeitsumfang.

3. Eine Klasse kann mehr als eine Schnittstelle implementieren, während sie nur von einer abstrakten Klasse erben kann.

                                  interface                      abstract class
the code                     - abstract methods               - abstract methods
                             - constants                      - constants                  
                                                              - concrete methods
                                                              - concrete variables

access modifiers             
                             - public                         - public
                                                              - protected
                                                              - private
                                                                etc.
number of parents          The same class can implement
                           more than 1 interface              The child class can 
                                                              inherit only from 1 abstract class

Ich hoffe, das hilft jedem beim Verständnis!

Ich weiß nicht, was in anderen Sprachen das Konzept der Schnittstelle ist.Aber was PHP betrifft, werde ich mein Bestes geben, um es zu erklären.Seien Sie einfach geduldig und kommentieren Sie bitte, ob dies geholfen hat.

Eine Schnittstelle fungiert als „Vertrag“ und gibt an, was eine Reihe von Unterklassen tut, aber nicht, wie sie es tun.

Die Regel

  1. Eine Schnittstelle kann nicht instanziiert werden.

  2. Sie können keine Methode in einer Schnittstelle implementieren, d. h.Es enthält nur die Signatur der Methode, jedoch keine Details (Körper).

  3. Schnittstellen können Methoden und/oder Konstanten, aber keine Attribute enthalten.Für Schnittstellenkonstanten gelten dieselben Einschränkungen wie für Klassenkonstanten.Schnittstellenmethoden sind implizit abstrakt.

  4. Schnittstellen dürfen keine Konstrukteure oder Zerstörer deklarieren, da dies Implementierungsdetails auf Klassenebene sind.
  5. Alle Methoden in einer Schnittstelle müssen öffentlich sichtbar sein.

Nehmen wir nun ein Beispiel.Angenommen, wir haben zwei Spielzeuge:Einer ist ein Hund und der andere ist eine Katze.

Wie wir wissen, bellt ein Hund und eine Katze miaut. Diese beiden haben die gleiche Sprechmethode, jedoch mit unterschiedlicher Funktionalität oder Implementierung.Angenommen, wir geben dem Benutzer eine Fernbedienung mit einer Sprechtaste.

Wenn der Benutzer die Sprechtaste drückt, muss das Spielzeug sprechen, egal ob es sich um einen Hund oder eine Katze handelt.

Dies ist ein guter Fall für die Verwendung einer Schnittstelle und nicht einer abstrakten Klasse, da die Implementierungen unterschiedlich sind.Warum?Erinnern

Wenn Sie die untergeordneten Klassen durch das Hinzufügen einer nicht-abstrakten Methode unterstützen müssen, sollten Sie abstrakte Klassen verwenden.Ansonsten wären Schnittstellen Ihre Wahl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top