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.


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


+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).


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.


-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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.