web-dev-qa-db-de.com

Wann muss ich Schnittstellen anstelle von abstrakten Klassen verwenden?

Ich habe mich gefragt, wann ich Schnittstellen verwenden sollte.

Lasst uns über Folgendes nachdenken:

public abstract class Vehicle {
   abstract float getSpeed();
}

und :

public interface IVehicle {
  float getSpeed();
}

Ich kann beide einfach implementieren, sie haben die gleiche Funktionalität ... ABER ich kann meiner Fahrzeugklasse auch einige Variablen hinzufügen, die wahrscheinlich in einem Fahrzeug verwendet werden sollten (maxSpeed, carType ...)

Was ist der Grund, Schnittstellen zu verwenden?

Vielen Dank!

EDIT: Ich habe einen schönen Link dazu in einem anderen Thread gefunden: http://www.thecoldsun.com/de/content/01-2009/abstract-classes-and-interfaces

81
augmentie123

Von Java How to Program über abstrakte Klassen:

Da sie nur als Superklassen in Vererbungshierarchien verwendet werden, ist Wir bezeichnen sie als abstrakte Superklassen. Diese Klassen können nicht .__ sein. Wird zum Instanziieren von Objekten verwendet, da abstrakte Klassen unvollständig sind. Unterklassen müssen die "fehlenden Teile" deklarieren, um "konkrete" Klassen zu werden, von dem aus Sie Objekte instanziieren können. Ansonsten auch diese Unterklassen wird abstrakt sein.

Um Ihre Frage zu beantworten "Was ist der Grund für die Verwendung von Schnittstellen?":

Der Zweck einer abstract-Klasse besteht darin, eine entsprechende Oberklasse bereitzustellen von denen andere Klassen erben können und somit ein gemeinsames Design haben.

Im Gegensatz zu einer Schnittstelle:

Eine -Schnittstelle beschreibt eine Gruppe von Methoden, die für eine .__ aufgerufen werden können. object, aber bietet keine konkreten Implementierungen für alle Methods ... Sobald eine Klasse eine Schnittstelle implementiert, haben alle Objekte dieser Klasse eine is-a Beziehung mit dem Schnittstellentyp und allen Objekten der garantiert, dass die Klasse die von .__ beschriebene Funktionalität bietet. Schnittstelle. Dies gilt auch für alle Unterklassen dieser Klasse.

Um Ihre Frage zu beantworten: "Ich habe mich gefragt, wann ich Schnittstellen verwenden sollte". Ich denke, Sie sollten Schnittstellen verwenden, wenn Sie eine vollständige Implementierung wünschen, und abstrakte Klassen verwenden, wenn Sie Teilstücke für Ihr Design wünschen (zur Wiederverwendbarkeit). 

91
kgdesouz

Aus den Oracle-Tutorials :

Anders als Schnittstellen können abstract-Klassen Felder enthalten, die nichtstatic und final sind, und sie können implementierte Methoden enthalten. Solche abstrakten Klassen sind Schnittstellen ähnlich, außer dass sie eine teilweise Implementierung bereitstellen und es den Unterklassen überlassen, die Implementierung abzuschließen. Wenn eine abstrakte Klasse nur abstrakte Methodendeklarationen enthält, sollte sie stattdessen als Schnittstelle deklariert werden.

Mehrere Schnittstellen können von Klassen an beliebiger Stelle in der Klassenhierarchie implementiert werden, unabhängig davon, ob sie in irgendeiner Beziehung zueinander stehen oder nicht. Denken Sie zum Beispiel an Comparable oder Cloneable.

Im Vergleich dazu werden abstract-Klassen am häufigsten in Teile der Implementierung geteilt. Eine einzelne abstrakte Klasse wird von ähnlichen Klassen unterteilt, die viele Gemeinsamkeiten haben (die implementierten Teile der abstrakten Klasse), aber auch einige Unterschiede aufweisen (die abstrakten Methoden).

15

Viele Fälle können in beiden Klassentypen implementiert werden.

Schnittstellen sind nützlich, wenn Sie eine Klasse definieren möchten, die mindestens grundlegende Funktionen haben muss. Wie eine echte Schnittstelle zum Beispiel USB.

interface USB {
    public function sendPower(); //charge iphone for example
    public function sendData(); //iTunes
    public function recieveData();
}

Verwenden Sie abstrakte Klassen, wenn Sie ein Objekt auf verschiedene Arten implementieren können.

abstract class MobilePhone {
    public function isIphone();

    public function charge() {
        //get some power, all phones need that
    }
}

class iPhone extends MobilePhone {
    public function isIphone() { return true; }
}
8
DanFromGermany

Es gibt eine Reihe von Situationen, in denen Sie die Verwendung einer Schnittstelle über einer abstrakten Implementierung in Betracht ziehen könnten

  • Wenn die verfügbare abstrakte Implementierung nicht das tut, was Sie möchten, und Sie möchten Ihre eigene erstellen
  • wenn Sie über eine vorhandene Klasse verfügen (die sich von einer anderen Klasse erstreckt) und Sie die Funktionalität der Schnittstelle implementieren möchten

Im Allgemeinen wurden Schnittstellen eingeführt, um unter anderem den Mangel an mehrfacher Vererbung zu überwinden 

7
MadProgrammer

Durch die Unterstützung von Standardmethoden in interface seit dem Start von Java 8 wurde die Lücke zwischen den Klassen interface und abstract verringert, doch sie weisen immer noch große Unterschiede auf.

  1. Variablen in der Schnittstelle sind public static final. Abstrakte Klassen können jedoch andere Arten von Variablen haben, wie private, protected usw

  2. Methoden in der Schnittstelle sind public oder public static, aber Methoden in der abstrakten Klasse können private und protected sein

  3. Verwenden Sie abstract class, um eine Beziehung zwischen miteinander verbundenen Objekten herzustellen. Verwenden Sie interface, um eine Beziehung zwischen nicht verbundenen Klassen herzustellen.

In diesem article finden Sie spezielle Eigenschaften von Schnittstelle in Java 8. Der statische Modifikator für Standardmethoden in der Schnittstelle führt zu Kompilierzeitfehlern in abgeleiteten Fehlern, wenn Sie @override verwenden möchten.

In diesem Artikel wird erläutert, warum in Java 8 Standardmethoden eingeführt wurden: Zur Verbesserung der Collections-API in Java 8 zur Unterstützung von Lambda-Ausdrücken.

Schauen Sie sich auch die Dokumentation zu Oracle an, um die Unterschiede besser zu verstehen.

Schauen Sie sich diese verwandten SE-Fragen mit Codebeispiel an, um die Dinge besser zu verstehen: 

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

3
Ravindra babu

Von Die Java ™ -Tutorials - Abstrakte Klassen im Vergleich zu Schnittstellen

Welche sollten Sie verwenden, abstrakte Klassen oder Schnittstellen?

  • Erwägen Sie die Verwendung abstrakter Klassen, wenn eine dieser Aussagen auf Ihre Situation zutrifft:
    • Sie möchten Code unter mehreren eng miteinander verwandten Klassen teilen.
    • Sie erwarten, dass Klassen, die Ihre abstrakte Klasse erweitern, viele allgemeine Methoden oder Felder aufweisen oder andere Zugriffsmodifizierer als public (wie protected und private) erfordern.
    • Sie möchten nicht statische oder nicht abschließende Felder deklarieren. Auf diese Weise können Sie Methoden definieren, die auf den Status des Objekts, zu dem sie gehören, zugreifen und diesen ändern können.
  • Erwägen Sie die Verwendung von Schnittstellen, wenn eine der folgenden Aussagen auf Ihre Situation zutrifft:
    • Sie erwarten, dass nicht verknüpfte Klassen Ihre Schnittstelle implementieren. Beispielsweise werden die Schnittstellen Comparable und Cloneable von vielen nicht verwandten Klassen implementiert.
    • Sie möchten das Verhalten eines bestimmten Datentyps angeben, ohne sich jedoch darum zu kümmern, wer sein Verhalten implementiert.
    • Sie möchten die Mehrfachvererbung des Typs nutzen.

Ein Beispiel für eine abstrakte Klasse im JDK ist AbstractMap, das Teil des Collections Framework ist. Seine Unterklassen (darunter HashMap, TreeMap und ConcurrentHashMap) verwenden viele Methoden (einschließlich get, put, isEmpty, containsKey und containsValue), die AbstractMap definiert.

3
Akash5288

Betrachten von Java:

Schnittstellen:

  • Sind eine grundlegende OOP Abstraktion.
  • Wird oft (aber nicht immer) klareren Code liefern als abstrakte Klassen.
  • Kann von mehreren konkreten Klassen für verschiedene Situationen implementiert werden.
  • Kann direkt Szenarien implementieren, die Mehrfachvererbung erfordern.
  • Kann zu Testzwecken leichter verspottet werden.
  • Sind nützlich für JDK-Proxys (siehe Java.lang.reflect.Proxy).

Dies ist nur der Anfang einer sehr langen Liste von Vor-/Nachteilen für Schnittstellen im Vergleich zu abstrakten Klassen.

1
Arthur Dent

Verwenden Sie eine abstract class, wenn Sie eine template für eine Gruppe von Unterklassen definieren möchten, und Sie mindestens über einen Implementierungscode verfügen, den Aufruf-Unterklassen verwenden könnten.

Verwenden Sie eine Schnittstelle , wenn Sie die Rolle definieren möchten die andere Klassen spielen können, unabhängig davon, wo sich diese Klassen im Vererbungsbaum befinden.

du erweitere eine abstrakte Klasse

du implementiere eine Schnittstelle :)

in einem interface sind alle Felder automatisch publicstaticfinal und alle Methoden sind public, während eine abstract-Klasse Ihnen hier etwas Flexibilität gibt.

1
user2768308

Dies ist ein direkter Auszug aus dem ausgezeichneten Buch " Thinking in Java " von Bruce Eckel.

[..] Sollten Sie eine interface - oder eine abstract-Klasse verwenden? 

Nun, eine Schnittstelle bietet Ihnen die Vorteile einer abstrakten Klasse und die Vorteile einer Schnittstelle. Wenn Sie also die Basisklasse ohne Methodendefinitionen oder Membervariablen erstellen können, sollten Sie immer Schnittstellen abstrakten Klassen vorziehen. 

Wenn Sie wissen, dass etwas eine Basisklasse sein wird, sollte Ihre erste Wahl darin bestehen, sie zu einer Schnittstelle zu machen. Nur wenn Sie gezwungen sind, Methodendefinitionen oder Membervariablen zu verwenden, sollten Sie in eine abstrakte Klasse wechseln.

1
fortytwo

Abstrakte Klasse : Verwenden Sie es, wenn eine starke Is-Beziehung zwischen Superklasse und Unterklasse besteht und alle Unterklassen ein gemeinsames Verhalten aufweisen.

Schnittstelle : Definiert ein Protokoll, dem alle Unterklassen folgen müssen.

0
Ravi Soni

Mit abstrakten Klassen können Sie keine Mehrfachvererbung erreichen. Daher bietet Sun Microsystems Schnittstellen an. 

Sie können nicht zwei Klassen erweitern, Sie können jedoch mehrere Schnittstellen implementieren.

0
kavi temre

Abstrakte Klassen können Methoden enthalten, die nicht abstrakt sind, wohingegen Ihre Methoden in Schnittstellen abstrakt sind und implementiert werden müssen.

Sie sollten stattdessen Schnittstellen verwenden, wenn Sie wissen, dass Sie immer bestimmte Methoden implementieren. Sie können auch von mehreren Schnittstellen erben. Dies ist die Art und Weise, wie Java mit der Mehrfachvererbung umgeht

0
Will Jamieson

Tatsächlich werden Interface und abstrakte Klasse verwendet, um nur einige Verträge/Regeln anzugeben, die lediglich zeigen, wie ihre Unterklassen aussehen werden. 

Meistens wissen wir, dass das Interface eine reine Zusammenfassung ist. Da bedeutet, dass Sie keine einzige Methode mit body angeben können. Dieser besondere Punkt ist die Vorteile der abstrakten Klasse. 

Wenn Sie also etwas über Ihre Unterklasse angeben möchten, können Sie sich für die Schnittstelle entscheiden. Aber wenn Sie auch etwas für Ihre Unterklassen angeben möchten und Sie möchten, dass auch Ihre Klasse eine eigene Methode haben sollte. In diesem Fall können Sie sich für eine abstrakte Klasse entscheiden

0
sridhar

die Schnittstelle wird im Wesentlichen verwendet, wenn zwei Parteien zusammenarbeiten und eine Partei etwas vor anderen verbergen möchte (oder nur einen Teil ihrer Klasse anzeigen möchte). Dann verwenden wir die Schnittstelle, z. B. in jdbc Sie wollen uns alles verbergen.

abstract class wird nur in diesem Fall verwendet, wenn wir ein gemeinsames Verhalten in mehr als einer Klasse unterstützen möchten ... oder eine vorimplementierte Implementierung mit unimplementierten Methoden (Methoden sollten abstrakt) . Das http Servlet in der Servlet-Schnittstelle ist eine abstrakte Klasse. Diese Klasse implementiert die Servlet-Schnittstelle, es sei denn, es handelt sich um eine Servicemethode. 

0
praveen tyagi

Die Antwort auf diese Frage ist sehr einfach. Was auch immer wir mit Interface tun können, kann mit der abstrakten Klasse Agree erledigt werden. Wenn also Interfaces verwendet werden, liegt die Antwort in der C # -Einschränkung der Mehrfachvererbung. Wenn Sie nur Verträge (Abstracts) zu deklarieren haben und möchten, dass Ihre Unterklassen sie mit Schnittstellen implementieren, weil Sie in diesem Fall abstrakte Klassen verwenden können, können Sie nicht von einer weiteren Klasse erben und stecken fest, wenn Sie von einer erben möchten mehr Klasse, aber Sie können so viele Schnittstellen implementieren.

0
Dinesh

Wenn Sie JDK 8 verwenden, gibt es keinen Grund, abstrakte Klassen zu verwenden, denn was auch immer wir mit abstrakten Klassen machen, wir können es jetzt aufgrund von Standardmethoden mit Schnittstellen tun. Wenn Sie eine abstrakte Klasse verwenden, müssen Sie sie erweitern und es gibt eine Einschränkung, die Sie nur einmal erweitern können. Wenn Sie jedoch die Schnittstelle verwenden, können Sie beliebig viele implementieren. 

Die Schnittstelle ist standardmäßig eine abstrakte Klasse und alle Methoden und Konstruktoren sind öffentlich. 

0
HM Nayem

Interface und Abstract Class sind die zwei verschiedenen Möglichkeiten, Abstraktion in OOP -Sprachen zu erreichen.

Die Schnittstelle bietet 100%-Abstraktion, d. H. Alle Methoden sind abstrakt.

Die abstrakte Klasse bietet 0 to 100%-Abstraktion, d. H. Sie kann abstrakte Methoden haben oder nicht.

Wir können Interface verwenden, wenn alle Funktionalitäten eines Typs vom Client implementiert werden sollen.

Wir können Abstract Class verwenden, wenn einige übliche Funktionen vom Abstract Class-Implementierer bereitgestellt werden können und der Client die Möglichkeit hat, das zu implementieren, was er tatsächlich benötigt. 

0
Raghu