Czy mogę traktować metody interfejsu jako metody abstrakcyjne?

15

Myślałem o tym i miałem pewne wątpliwości.

Kiedy deklaruję interfejs, na przykład:

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

Czy te metody interfejsu można uznać za abstrakcyjne? Mam na myśli to, że pojęcie metody abstrakcyjnej to:

Metoda abstrakcyjna to metoda zadeklarowana, ale nie zawierająca implementacji.

Czy można zatem uznać te metody za abstrakcyjne? Nie są to „czyste” abstrakcyjne metody, ponieważ nie używam tego abstractsłowa, ale koncepcyjnie wygląda na to, że są.

Co możesz mi o tym powiedzieć?

Dzięki.

rogcg
źródło
Prawdopodobnie najlepszy na SO
billy.bob 30.09.11
5
@ billy.bob - Myślę, że to zbyt abstrakcyjne jak na przepełnienie stosu. Nie ma tu konkretnego problemu z kodowaniem.
ChrisF
Czy to jest kod Java?
Andres F.,
nie, nie jest. to tylko przykład. pytanie nie koncentruje się na żadnym języku programowania.
rogcg,

Odpowiedzi:

14

Interfejs jest jak „czysto” klasa abstrakcyjna. Klasa i wszystkie jej metody są abstrakcyjne. Klasa abstrakcyjna może mieć zaimplementowane metody, ale sama klasa nie może być utworzona (użyteczne do dziedziczenia i po DRY).

Dla interfejsu, ponieważ nie ma żadnej implementacji, są one przydatne do ich celu: umowy. Jeśli implementujesz interfejs, musisz  zaimplementować metody w interfejsie.

Różnica polega na tym, że klasa abstrakcyjna może mieć zaimplementowane metody, podczas gdy interfejs nie.

Dzieje się tak dlatego, że klasa może implementować kilka interfejsów. Java i C # ograniczają klasę do wrodzonej klasy pojedynczego rodzica. Niektóre języki pozwalają na dziedziczenie z wielu klas, a pracę interfejsu można wykonać za pomocą „czysto” abstrakcyjnej klasy. Ale wielokrotne dziedziczenie ma swoje problemy, a mianowicie przerażający problem diamentowy

koder
źródło
+1 za uwzględnienie różnicy między dziedziczeniem klasy abstrakcyjnej a implementacją jednego lub więcej interfejsów.
Diamentowy problem to niesamowity paradoks.
rogcg 30.09.11
1
Nie zgadzam się z „Interfejs jest jak część„ czysto ”abstrakcyjna”. Są to 2 różne rodzaje „bloków konstrukcyjnych” OO, więc tak naprawdę wcale nie są do siebie podobne. Mają wspólne cechy, ale z natury są to różne typy, bardziej jak mężczyźni i kobiety na przykład :)
NoChance,
5
@Emmand Kareem Nie zgadzam się z tym, że „Interfejs jest jak część„ czysto ”abstrakcyjna. Dlatego to napisałem :-). Jeśli masz jakieś uzasadnione powody, by się nie zgadzać, napisz, chciałbym usłyszeć
koder
Warto zauważyć, że c # 8 wprowadza również koncepcję domyślnej implementacji interfejsu
John Wu
11

Znalazłem przydatną odpowiedź tutaj: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Wszystkie metody interfejsu są domyślnie abstrakcyjne, więc abstrakcyjny modyfikator nie jest używany z metodami interfejsu (może być - po prostu nie jest to konieczne).

rogcg
źródło
1
Zauważ także, że klasa abstrakcyjna rozciąga się na jeszcze jeden obiekt. Interfejsy nie mają pojęcia nadklasy.
2
Pamiętaj również, że możesz zaimplementować wiele interfejsów, ale możesz dziedziczyć tylko z jednej klasy, abstrakcyjnej lub nie.
NullUserException
@ ThorbjørnRavnAndersen: Interfejs może rozszerzać jeden lub więcej interfejsów. To nie jest to samo, co superklasa, ale poziom odziedziczenia.
unholysampler 30.09.11
Możesz wdrożyć wiele interfejsów. Wygląda jak koncepcja wielokrotnego dziedziczenia, ale nie do końca.
rogcg 30.09.11
@unholysampler, który nie jest nadklasą - jak powiedziałem.
4

Klasy abstrakcyjne mogą mieć metody abstrakcyjne.

Interfejsy mogą mieć tylko metody abstrakcyjne.

method1()a method2()w twoim przykładzie są metody abstrakcyjne.

Tulains Córdova
źródło
-1

Różnica polega na tym, że klasy abstrakcyjne mogą zawierać szczegóły implementacji, chociaż same nie mogą być tworzone. Natomiast interfejs jest jedynie szablonem dla klasy

billy.bob
źródło
8
Metody abstrakcyjne nie mogą zawierać szczegółów implementacji. Klasy abstrakcyjne mogą.
Matt H
Znam różnicę między metodą a klasą - ale nie rozumiem, o co ci chodzi?
billy.bob
Twoja odpowiedź stwierdza, że ​​metody abstrakcyjne mogą zawierać szczegóły implementacji - nie mogą. Tylko literówka?
Matt H
1
Naprawiłem literówkę.
Martijn Verburg
1
@ billy.bob to pytanie dotyczy jednak metody abstact.
SoylentGray
-2

Tak więc w podklasie dziedziczona metoda abstrakcyjna może ponownie przejść w tryb abstrakcyjny bez implementacji, a jeśli klasa implementuje interfejs, metoda musi zostać zaimplementowana.

Devraj Giri
źródło
-3

Klasy interfejsów nie mają metod abstrakcyjnych. W ogóle nie mają żadnych metod. Mają po prostu listę metod, które inna klasa musiałaby wdrożyć, aby móc dostosować się do interfejsu. W twoim przykładzie nie ma metody method1 ani metody method2, dopóki ktoś nie doda tych metod do klasy.

gnasher729
źródło