Kann ich Schnittstellenmethoden als abstrakte Methoden betrachten?

15

Ich dachte darüber nach und hatte einige Zweifel.

Wenn ich eine Schnittstelle deklariere, zum Beispiel:

public interface MyInterface
{
   public void method1();
   public void method2();
}

Könnten diese Schnittstellenmethoden als abstrakt angesehen werden? Was ich meine ist, dass das Konzept einer abstrakten Methode ist:

Eine abstrakte Methode ist eine deklarierte Methode, die jedoch keine Implementierung enthält.

Könnten diese Methoden als abstrakt angesehen werden? Sie sind keine "reinen" abstrakten Methoden, da ich das abstractWort nicht verwende , aber konzeptionell sieht es so aus, als ob sie es sind.

Was kannst du mir darüber erzählen?

Vielen Dank.

Rogcg
quelle
Wahrscheinlich am besten auf SO
billy.bob
5
@ billy.bob - Ich denke, es ist zu abstrakt für Stack Overflow. Es gibt hier kein spezielles Codierungsproblem.
ChrisF
Ist das Java-Code?
Andres F.
Nein, ist es nicht. Es ist nur ein Beispiel. Die Frage bezieht sich nicht auf Programmiersprachen.
Rogcg

Antworten:

14

Eine Schnittstelle ist wie eine "rein" abstrakte Klasse. Die Klasse und alle ihre Methoden sind abstrakt. Eine abstrakte Klasse kann Methoden implementiert haben, aber die Klasse selbst kann nicht instanziiert werden (nützlich für die Vererbung und das Folgen von DRY).

Da für eine Schnittstelle überhaupt keine Implementierung vorhanden ist, sind sie für ihren Zweck nützlich: einen Vertrag. Wenn Sie die Schnittstelle  implementieren, müssen Sie die Methoden in der Schnittstelle implementieren.

Der Unterschied besteht also darin, dass eine abstrakte Klasse Methoden implementieren kann, eine Schnittstelle jedoch nicht.

Der Grund dafür ist, dass eine Klasse mehrere Schnittstellen implementieren kann. Java und C # beschränken eine Klasse auf eine einzige übergeordnete Klasse. In einigen Sprachen können Sie von mehreren Klassen erben und die Arbeit eines Interfaces über eine "rein" abstrakte Klasse erledigen. Aber Mehrfachvererbung hat ihre Probleme, nämlich das gefürchtete Diamantproblem

Kodierer
quelle
+1 für die Berücksichtigung des Unterschieds zwischen der Vererbung einer abstrakten Klasse und der Implementierung einer oder mehrerer Schnittstellen.
Diamond Problem ist ein unglaubliches Paradoxon.
Rogcg
1
Ich bin nicht einverstanden mit "Eine Schnittstelle ist wie ein" rein "abstrakter Klassenteil". Es handelt sich um zwei verschiedene Arten von OO-Bausteinen, daher sind sie sich überhaupt nicht ähnlich. Sie haben einige Gemeinsamkeiten, aber in der Natur sind sie unterschiedliche Typen, eher Männer und Frauen zum Beispiel :)
NoChance
5
@Emmand Kareem Ich bin nicht anderer Meinung als "Eine Schnittstelle ist wie ein" rein "abstrakter Klassenteil". Deshalb habe ich es geschrieben :-). Wenn Sie gute Gründe für Ihre Meinungsverschiedenheit haben, posten Sie bitte, id like to hear
coder
11

Ich habe hier eine nützliche Antwort gefunden: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Alle Methoden in einer Schnittstelle sind implizit abstrakt, daher wird der Modifikator abstract bei Schnittstellenmethoden nicht verwendet (es kann sein, dass dies nur nicht erforderlich ist).

Rogcg
quelle
1
Beachten Sie auch, dass eine abstrakte Klasse ein anderes Objekt erweitert. Schnittstellen haben keine Vorstellung von einer Oberklasse.
2
Beachten Sie auch, dass Sie mehrere Schnittstellen implementieren können, aber nur von einer Klasse erben können, abstrakt oder nicht.
NullUserException
@ ThorbjørnRavnAndersen: Eine Schnittstelle kann eine oder mehrere Schnittstellen erweitern. Es ist nicht dasselbe wie eine Superklasse, aber es ist eine Ebene der Vererbung.
Unholysampler
Sie können mehrere Schnittstellen implementieren. Sieht aus wie das Konzept der Mehrfachvererbung, aber nicht genau.
Rogcg
@unholysampler, das ist keine Superklasse - wie gesagt.
4

Abstrakte Klassen können abstrakte Methoden haben.

Schnittstellen können nur abstrakte Methoden haben.

method1()und method2()in Ihrem Beispiel sind abstrakte Methoden.

Tulains Córdova
quelle
-1

Der Unterschied besteht darin, dass abstrakte Klassen Implementierungsdetails enthalten können, die jedoch nicht selbst instanziiert werden können. Während eine Schnittstelle nur eine Vorlage für eine Klasse ist

Billy Bob
quelle
8
Abstrakte Methoden dürfen keine Implementierungsdetails enthalten. Abstrakte Klassen können.
Matt H
Ich kenne den Unterschied zwischen einer Methode und einer Klasse - aber ich kann den Punkt nicht verstehen, den Sie machen?
billy.bob
Ihre Antwort besagt, dass abstrakte Methoden Implementierungsdetails enthalten können - sie können nicht. Nur ein Tippfehler?
Matt H
1
Ich habe den Tippfehler behoben.
Martijn Verburg
1
@ billy.bob Bei dieser Frage geht es allerdings um die Abstact-Methode.
SoylentGray
-3

Interface-Klassen haben keine abstrakten Methoden. Sie haben überhaupt keine Methoden. Sie haben nur eine Liste von Methoden, die eine andere Klasse implementieren müsste, um sich an die Schnittstelle anpassen zu können. In Ihrem Beispiel gibt es keine Methode method1 und keine Methode method2, bis jemand einer Klasse diese Methoden hinzufügt.

gnasher729
quelle