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 abstract
słowa, ale koncepcyjnie wygląda na to, że są.
Co możesz mi o tym powiedzieć?
Dzięki.
Odpowiedzi:
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
źródło
Znalazłem przydatną odpowiedź tutaj: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html
źródło
Klasy abstrakcyjne mogą mieć metody abstrakcyjne.
Interfejsy mogą mieć tylko metody abstrakcyjne.
method1()
amethod2()
w twoim przykładzie są metody abstrakcyjne.źródło
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
źródło
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.
źródło
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.
źródło