it-swarm.com.de

Was ist der Sinn einer Schnittstelle?

Mögliches Duplikat:
Wann werden abstrakte Klassen anstelle von Schnittstellen und Erweiterungsmethoden in C # verwendet?
Welche anderen Gründe gibt es, eher Schnittstellen als abstrakte Klassen zu schreiben?

Diese Frage klang auch für mich etwas trivial, bis ich selbst ernsthaft darüber nachdachte.

Was ist der Sinn einer Java Schnittstelle)? Ist es wirklich Javas Antwort auf Mehrfachvererbung?

Obwohl ich eine Zeit lang Schnittstellen verwendet habe, bin ich nie dazu gekommen, über den Sinn all dessen nachzudenken. Ich weiß, was eine Schnittstelle ist, denke aber immer noch über das Warum nach.

20
hakish

Java erlaubt die Mehrfachvererbung der Schnittstelle. Einzelvererbung dient zur Implementierung.

Schnittstellen sind wichtig, weil sie das, was eine Klasse tut, von dem trennen, was sie tut. Der Vertrag, der definiert, was ein Kunde erwarten kann, lässt den Entwickler frei, ihn nach Belieben umzusetzen, solange er den Vertrag einhält.

Beispiele dafür finden Sie im gesamten JDK. Schauen Sie sich das Java.sql-Paket an - es ist voller Schnittstellen. Warum? So können verschiedene relationale Datenbanken diese Methoden für ihr bestimmtes Produkt implementieren. Clients müssen sich nur mit den Schnittstellenreferenztypen befassen. Das Ändern relationaler Datenbanken ist so einfach wie das Austauschen einer JDBC-Treiber-JAR gegen eine andere. Kunden müssen sich nicht ändern. (Solange sie nicht vom Vertrag abweichen.)

Dynamische Proxys und aspektorientierte Programmierung hängen von Schnittstellen ab. Auf diese Weise können sie die Implementierung zur Laufzeit ersetzen.

29
duffymo

Sie programmieren gegen eine Schnittstelle anstatt gegen eine konkrete Implementierung, um Ihren Code flexibel zu gestalten.

Zum Beispiel,

Sie programmieren gegen IScrewDriver, sodass Sie je nach Bedarf PhilipsScrewDriver oder FlatScrewDriver verwenden können.

Normalerweise verwenden Sie eine Art IoC-Container, um den entsprechenden Schraubendreher in Ihren Code zu "injizieren", aber das ist nicht wirklich notwendig.

Hoffe die Beispiele helfen.

13
Esteban Araya

Was ist der Sinn einer Java Schnittstelle)?

Der Punkt ist, die API (was zu tun ist) von der Implementierung (wie es zu tun ist) zu trennen.

Schnittstellen sind auch erforderlich, wenn Rückrufe verwendet werden, da Java erlaubt es Ihnen nicht, Funktionsreferenzen zu übergeben.

Ist es wirklich Javas Antwort auf Mehrfachvererbung?

Unter anderem ja. Es gibt Ihnen einige der Merkmale von MI, ohne die bösen Komplikationen.

8
Mike Baranczak

Es gibt viele Gründe, warum Java ein eigenes Konstrukt für Mehrfachvererbung hat, d. H. Mit interface und abstract Klassen. Hier sind drei, an die ich denken kann:

Es reduziert den Boilerplate-Code (d. H. Reine virtuelle Funktionen).

In Sprachen, die nicht das Konstrukt interface haben, müssen Sie viel Boilerplate-Codierung durchführen. In C++ müssen Sie eine Klasse erstellen, die reine virtuelle Funktionen hat:

class MyInterface
{
public:
  virtual void show() = 0;
  virtual int number() = 0;
};

class ConcreteImpl : public MyInterface
{
public:
  void show()
  {
    cout << "Concrete Impl here";
  }
  int number()
  {
    return 1337;
  }
};

Das Äquivalent in Java wäre weniger ausführlich, hauptsächlich weil Methoden virtuelle (überschreibbare) Funktionen sind. Und es ist offensichtlicher, dass eines der Artefakte die Schnittstelle ist.

interface MyInterface {
  void show();
  int number();
}

class ConcreteImpl implements MyInterface {
   public void show() {
     System.out.println("Concrete Impl here");
   }
   public int number() { return 1337; }
}

Java erlaubt eine Klasse mit gemischter reiner virtueller und Implementierung mit dem Schlüsselwort abstract.

Dies schränkt das Problem der "Diamantvererbung" ein

Eines der Probleme bei der Mehrfachvererbung ist das haarige Diamantvererbungsproblem . Überlegen Sie, ob Sie eine Sprache haben, die diese Klassenkette in einer Sprache wie C++ zulässt:

Diamond inherted class

Stellen Sie sich ein SuperBaseClass vor, in dem zwei BaseClass implementiert sind, die beide die Methode des SuperBaseClass als virtuelle Funktionen implementieren. Beide BaseClass werden wiederum von der Klasse MyImplementation implementiert. Überlegen Sie, was passiert, wenn Sie super() in MyImplementation.draw() aufrufen? Es ist nicht immer klar, was passieren wird, selbst in C++ werden sich Entwickler, die dies entworfen haben, in einer seltsamen Debugging-Sitzung befinden.

An der Diamantvererbung ist nichts Besonderes auszusetzen. Um die Probleme beim Aufrufen der Supermethode zu vermeiden, müssen Sie sie entweder mithilfe reiner virtueller Funktionen oder auf intelligentere Weise entwerfen. Da in Java standardmäßig alle Methoden virtuell sind, sind Sie durch die Tatsache eingeschränkt, dass Sie mit interfaces nur mehrere Vererbungen durchführen können, da sie keine Implementierung enthalten (mit dem Schlüsselwort implements). . Andere Klassen, auch abstract, können nur einzeln vererbt werden (mit dem Schlüsselwort extends).

Erfahrene Entwickler verwendeten bereits Schnittstellen als Konzept (ca. 1995).

Wenn Sie sich mit Design Patterns by GoF befasst haben, werden Sie feststellen, dass diese beim Entwurf erweiterbarer Systeme stark von Schnittstellen abhängen. In der Tat ist eines der Prinzipien von Design Patterns:

"Programmieren Sie auf eine 'Schnittstelle', nicht auf eine 'Implementierung'." (Gang of Four 1995: 18)

Schnittstelle im GoF-Sinne bedeutet, dass Sie eher auf eine Oberklasse als auf die Implementierung programmieren sollten. Ein Beispiel wäre, dass Sie Ihre Variable lieber in Collection<T>, Iterable<T> Oder List<T> Anstelle von ArrayList<T> In Java if eingeben sollten Die einzige Methode, die Sie für das Objekt verwenden, besteht darin, es zu iterieren. Ein Musterbeispiel von GoF wäre das Strategiemuster , bei dem der Kontext nicht die genaue Strategie kennen muss, die er zur Ausführung erhält, sondern die festgelegte Strategie ausführt, unabhängig davon, was es war.

8
Spoike

Das hat mich immer verwirrt, bis mir etwas klar wurde:

Grundsätzlich ist eine Schnittstelle einfach eine Klasse, die nur abstrakte Methoden enthält. Indem Sie eine solche Entität zu einer Schnittstelle machen, erhalten Sie eine gewisse Flexibilität, die Sie mit Klassen nicht haben.

4
Loren Pechtel

Gefunden dieser Link um wirklich nützlich zu sein. Einige Auszüge, die für mich Sinn machten:

... Die Trennung von Schnittstelle und Implementierung ist eine der Hauptideen hinter Java im Allgemeinen. Die Java virtuelle Maschine (JVM)) ist beispielsweise eine Ein abstrakter Computer, der definiert, wie Ihr Programm mit dem zugrunde liegenden realen Computer "verbunden" wird. Eine JVM, die unter Windows ausgeführt wird, ist eine Implementierung dieses abstrakten Computers. Eine JVM, die auf dem Macintosh ausgeführt wird, ist eine andere. Eine JVM, die auf Ihrer Armbanduhr ausgeführt wird, ist noch vorhanden Ein weiterer

Schnittstellen bieten mehr Polymorphismus als einfach vererbte Klassenfamilien, da bei Schnittstellen nicht alles in eine Klassenfamilie passen muss.

Durch die Verwendung von Schnittstellen entkoppeln Sie die Teile Ihres Systems voneinander und generieren Code, der flexibler ist: einfacher zu ändern, zu erweitern und anzupassen.

2
hakish

A implements B, C ist nicht dasselbe wie A extends B, C

Obwohl es ziemlich klar aussieht, war auch ich immer verwirrt, wenn Leute sagen, dass Schnittstellen eine Antwort auf das Fehlen einer Mehrfachvererbung sind.

Wie dieser Link zeigt, gibt es Möglichkeiten, die Mehrfachvererbung unter Verwendung von Schnittstellen zu simulieren. Die Schnittstelle hilft jedoch nicht direkt bei der Implementierung der Mehrfachvererbung.

Ich glaube, die Schnittstelle ist für die mehrfache Untertypisierung vorgesehen. Im obigen Beispiel ist A sowohl vom Typ B als auch vom Typ C. Daher kann A entweder für Mitglieder von B oder für Mitglieder von C eingesetzt werden (siehe dieser Wikipedia-Artikel ).

Da Sie mehrere Implementierungen einer einzelnen Schnittstelle haben können, hilft dies auch beim dynamischen Polymorphismus. Ihr Code hängt vom Typ (der Schnittstelle) und nicht von der Implementierung ab (die je nach Kontext dynamisch ersetzt werden kann).

1
Vamsi

Ja, Schnittstellen sind Javas Antwort auf Mehrfachvererbung. Es gibt absolut nichts, was eine Schnittstelle tun kann, was eine abstrakte Klasse nicht kann, außer der Tatsache, dass mehrere Schnittstellen an der Abstammung einer Klasse teilnehmen können, während mehrere Klassen dies nicht können.

Daher verwenden wir eine Schnittstelle anstelle einer abstrakten Klasse, um Nachkommen die Freiheit zu geben, die gewünschte Basisklasse zu erweitern (und unsere Schnittstelle zu implementieren), anstatt sie zu zwingen, eine bestimmte Basisklasse zu erweitern.

0
Mike Nakis