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.


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


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


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.


-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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.