Empfohlen, 2019

Tipp Der Redaktion

Unterschied zwischen Schnittstelle und abstrakter Klasse in Java & C #

Interface und Abstract-Klasse tragen beide zu "unvollständigem Typ" in OOP bei. Manchmal brauchen wir eine Superklasse, um zu definieren, "was zu tun ist", aber nicht "wie zu tun", sondern die Art und Weise, wie ein Teil von der abgeleiteten Klasse entsprechend ihren Bedürfnissen implementiert wird. " Interface " bietet eine Lösung dafür. Manchmal benötigen wir eine Superklasse, die eine verallgemeinerte Struktur definiert, die von abgeleiteten Klassen implementiert werden kann, und eine bestimmte Struktur, die von den abgeleiteten Klassen verwendet werden kann. Die „ abstrakte Klasse “ bietet eine Lösung dafür. Der grundlegende Unterschied zwischen Schnittstelle und abstrakter Klasse besteht darin, dass die Schnittstelle vollständig und die abstrakte Klasse teilweise unvollständig ist.

Vergleichstabelle

VergleichsgrundlageSchnittstelleAbstrakte Klasse
BasicWenn Sie nur über die Anforderungen Bescheid wissen, nicht über deren Implementierung, verwenden Sie "Schnittstelle".Wenn Sie etwas über die Implementierungen wissen, verwenden Sie "abstrakte Klassen".
MethodenDie Schnittstelle enthält nur abstrakte Methoden.Die abstrakte Klasse enthält sowohl abstrakte als auch konkrete Methoden.
Zugriffsmodifizierer von MethodenInterface-Methoden sind immer "Public" und "Abstract", auch wenn wir nicht deklarieren. Es kann also als 100% reine abstrakte Klasse bezeichnet werden.Es ist nicht zwingend, dass die Methode in der abstrakten Klasse öffentlich und abstrakt ist. Es kann auch konkrete Methoden haben.
Eingeschränkter Modifikator für MethodenEine Schnittstellenmethode kann nicht mit den folgenden Modifizierern deklariert werden:
Öffentlich: Privat und geschützt
Zusammenfassung: final, statisch, synchronisiert, native, strictfp.
Es gibt keine Einschränkungen für die Modifizierer der abstrakten Klassenvariablen.
Zugriffsmodifizierer für VariablenZugriffsmodifizierer für Schnittstellenvariablen sind public, static & final, unabhängig davon, ob wir deklarieren oder nicht.Die Variablen in der abstrakten Klasse müssen nicht public, static, final sein.
Eingeschränkte Modifizierer für VariablenSchnittstellenvariablen können nicht als privat, geschützt, vorübergehend oder flüchtig deklariert werden.Es gibt keine Einschränkung für die Modifizierer abstrakter Klassenvariablen.
Initialisierung von VariablenDie Schnittstellenvariablen müssen zum Zeitpunkt ihrer Deklaration initialisiert werden.Es ist nicht zwingend, dass abstrakte Klassenvariablen zum Zeitpunkt ihrer Deklaration initialisiert werden müssen.
Instanz- und statische BlöckeInnerhalb der Benutzeroberfläche können Sie keine Instanz oder statischen Block deklarieren.Die abstrakte Klasse erlaubt eine Instanz oder einen statischen Block.
KonstruktorenSie können in der Schnittstelle keinen Konstruktor deklarieren.Sie können einen Konstruktor innerhalb einer abstrakten Klasse deklarieren.

Definition der Schnittstelle

Java erlaubt keine Mehrfachvererbung. Das heißt, eine einzelne Klasse kann jeweils nur eine Klasse erben. Der Grund dafür kann an einem Beispiel erklärt werden. Nehmen wir an, wir haben zwei übergeordnete Klassen, A und B, und eine abgeleitete Klasse C. Die abgeleitete Klasse C erbt sowohl die Klassen A als auch B. Jetzt haben beide Klassen A und B die Methode set (), dann wird es eine Frage sein Für die Klasse C soll die set () - Methode dieser Klasse erben. Die Lösung für dieses Problem ist "Schnittstelle".

Interface ist eine reine abstrakte Klasse. Das Schlüsselwort zum Erstellen einer Schnittstelle lautet "Schnittstelle". Da alle Methoden innerhalb der Schnittstelle völlig abstrakt sind. Die Schnittstelle gibt nur an, was eine Klasse tun muss, definiert jedoch nicht, wie sie funktioniert. Nur weil alle innerhalb der Schnittstelle deklarierten Methoden abstrakt sind, wird keine Instanz für eine Schnittstelle erstellt. Die allgemeine Form der "Schnittstelle" in Java ist:

 access_specifier interface Schnittstellenname {Rückgabetyp Methodenname1 (Parameterliste); Rückgabetyp Methodenname2 (Parameterliste); Typ final-varname1 = Wert; Typ final-varname2 = Wert; // ... Rückgabetyp MethodennameN (Parameterliste); Typ final-varnameN = Wert; } 

Der Zugriffsbezeichner wird als public deklariert, da die Klassen die Schnittstelle implementieren müssen.

Wir haben nicht das Konzept von "Interface" in C ++. Aber Java und C # definieren die Schnittstelle sehr gut.

Schnittstelle in Java:

  • Variablen einer Schnittstelle sind standardmäßig immer public, static und final.
  • Variablen müssen zum Zeitpunkt ihrer Deklaration initialisiert werden.
  • Variablen können niemals als privat, geschützt, vorübergehend und flüchtig deklariert werden.
  • Methoden einer Schnittstelle sind immer öffentlich und abstrakt, während sie niemals als privat, geschützt, endgültig, statisch, synchronisiert, nativ und streng deklariert werden können.
  • Sie können keinen Konstruktor innerhalb einer Schnittstelle deklarieren, da der Hauptzweck des Konstruktors die Initialisierung von Klassenvariablen ist. In Schnittstellenvariablen werden sie jedoch zum Zeitpunkt ihrer Deklaration initialisiert.
  • Die Schnittstelle kann andere Schnittstellen erben, aber die Klasse, die eine solche Schnittstelle implementiert, muss die Methoden aller geerbten Schnittstellen implementieren.
  • Eine Klasse kann mehr als eine Schnittstelle gleichzeitig erben und muss alle Methoden aller geerbten Schnittstellen implementieren.

Die allgemeine Form der Implementierung einer Schnittstelle in Java:

 class class_name implementiert Interface_Name {// class-body} 

Um ein Interface zu erben, verwendet eine Klasse ein Schlüsselwort "implements", und die Klasse implementiert alle von einem geerbten Interface deklarierten Methoden.

Schnittstelle in C #:

Die Schnittstelle in C # ist der Schnittstelle in Java nahezu ähnlich, mit Ausnahme von:

  • Schnittstelle in C # deklariert keine Variablen.
  • Dem Namen der Schnittstelle wird ein Großbuchstabe I vorangestellt und ein Doppelpunkt (:) - Zeichen vererbt.

Die allgemeine Form der Implementierung einer Schnittstelle in C #:

 class class_name: Schnittstellenname {// class-body} 

Definition von abstrakten Klasse

Eine Klasse, die eine oder mehrere abstrakte Methoden enthält, wird als abstrakte Klasse bezeichnet. Eine Klasse wird mit dem Schlüsselwort „abstract“ als abstrakt deklariert, dem das Schlüsselwort „class“ am Anfang der Klassendeklaration vorangeht. Da die abstrakte Klasse die abstrakte Methode enthält, bildet sie einen unvollständigen Typ. Daher können Sie keine Objekte einer abstrakten Klasse erstellen. Wenn eine Klasse eine abstrakte Klasse erbt, muss sie alle abstrakten Methoden der abstrakten Klasse implementieren. Wenn dies nicht der Fall ist, muss sie auch als abstrakt deklariert werden. Das abstrakte Attribut wird so lange vererbt, bis die vollständige Implementierung der abstrakten Methoden erreicht ist.

Die abstrakte Klasse kann auch konkrete Methoden enthalten, die von der abgeleiteten Klasse unverändert verwendet werden können. Sie können jedoch keinen abstrakten Konstruktor oder eine abstrakte statische Methode innerhalb einer abstrakten Klasse deklarieren. Die allgemeine Form der abstrakten Klasse in Java ist wie folgt:

 abstrakte Klasse Klassenname {Abstrakte Methodenname1 (); abstrakter Methodenname2 (); : return_type method_name3 (parameter_list) {// konkrete Methode} return_type method_name4 (parameter_list) {// konkrete Methode}}; 

Das Konzept einer abstrakten Klasse ist in Java und C # ähnlich. Eine abstrakte Klasse unterscheidet sich in C ++ geringfügig.

Wenn eine Klasse in C ++ mindestens eine virtuelle Funktion hat, wird die Klasse zu einer abstrakten Klasse. Anstelle des Schlüsselworts „abstract“ wird das Schlüsselwort „virtual“ verwendet, um eine abstrakte Methode zu deklarieren.

Hauptunterschiede zwischen Schnittstelle und abstrakter Klasse in Java & C #

  1. Wenn Sie wissen, "was erforderlich ist", aber nicht, "wie es implementiert werden würde", muss die Schnittstelle verwendet werden. Wenn Sie andererseits wissen, was erforderlich ist und teilweise weiß, wie es implementiert werden soll, verwenden Sie eine abstrakte Klasse.
  2. Eine Schnittstelle hat alle ihre Methoden abstrakt, aber eine abstrakte Klasse hat einige abstrakte Methoden und einige konkrete Methoden.
  3. Die Methoden innerhalb einer Schnittstelle sind öffentlich und abstrakt und werden daher auch als reine abstrakte Klasse bezeichnet. Auf der anderen Seite sind die Methoden innerhalb eines Abstracts nicht darauf beschränkt, öffentlich und abstrakt zu sein.
  4. Eine Schnittstellenmethode kann niemals privat, geschützt, endgültig, statisch, synchronisiert, nativ oder strictfp sein. Auf der anderen Seite gibt es keine Einschränkungen für Methoden einer abstrakten Klasse.
  5. Die Variablen in einer Schnittstelle sind public und final, unabhängig davon, ob wir sie deklarieren oder nicht. Es besteht jedoch keine Einschränkung, dass die Variablen einer abstrakten Klasse nur public und final sind.
  6. Variablen in einer Schnittstelle können niemals privat geschützt vorübergehend oder flüchtig sein, wohingegen es keine Einschränkung auf Variablen in einer abstrakten Klasse gibt.
  7. Die Variable einer Schnittstelle muss bei der Deklaration initialisiert werden. Andererseits können die Variablen in einer abstrakten Klasse jederzeit initialisiert werden.
  8. Innerhalb einer Schnittstelle kann eine Instanz oder ein statischer Block nicht deklariert werden. Sie können jedoch eine Instanz oder einen statischen Block innerhalb einer abstrakten Klasse deklarieren.
  9. Sie können keinen Konstruktor innerhalb einer Schnittstelle definieren, wohingegen Sie einen Konstruktor innerhalb einer abstrakten Klasse definieren können.

Fazit:

Wenn Sie eine Basisklasse erstellen müssen, die eine verallgemeinerte Form von Methoden enthält, die je nach Bedarf von den abgeleiteten Klassen implementiert werden können, hilft das Konzept der Schnittstelle und der abstrakten Klasse dabei.

Top