Jeśli moja klasa implements
jest interfejsem, to czy mogę powiedzieć, że śledzę dziedziczenie? Wiem, że kiedy klasa jest extends
inną klasą, to jest to dziedzictwo.
Jeśli moja klasa implements
jest interfejsem, to czy mogę powiedzieć, że śledzę dziedziczenie? Wiem, że kiedy klasa jest extends
inną klasą, to jest to dziedzictwo.
Odpowiedzi:
AKTUALIZACJA: Poprawiłem tę odpowiedź. Podkreślono wiele dobrych punktów w komentarzach, które zasługiwały na odwołanie.
Jeśli moja klasa implementuje interfejs, czy mogę powiedzieć, że śledzę dziedziczenie?
Nie jest do końca jasne, co rozumiesz przez „podążanie za spadkiem”. Zadajmy nieco inne pytanie?
Co to jest dziedziczenie?
Te są subtelnie różne. To niefortunne, ponieważ jest mylące.
Jakie nieporozumienia zwykle wynikają z tego subtelnego rozróżnienia?
Może pojawić się zamieszanie, ponieważ ludzie myślą o dziedziczeniu jako mechanizmie udostępniania szczegółów implementacji. Chociaż jest to taki mechanizm, mechanizm ten działa poprzez udostępnianie członków . Ci członkowie nie muszą mieć wdrożeń! Jak zobaczymy, mogą być abstrakcyjne.
Osobiście byłbym szczęśliwszy, gdyby specyfikacje Java i C # używały słowa innego niż „dziedziczy” do opisania związku między metodami interfejsu i klasami, aby uniknąć tego zamieszania. Ale nie robią tego i musimy uzasadniać na podstawie specyfikacji, a nie przeciwko nim.
Czy w Javie członkowie interfejsu są dziedziczeni przez klasy, które je implementują?
Tak, niektóre są. Zobacz specyfikację Java w sekcji 8.4.8, którą cytuję tutaj dla Twojej wygody.
Klasa C dziedziczy po swojej bezpośredniej nadklasie i bezpośrednich super interfejsach wszystkie abstrakcyjne i domyślne metody m, dla których spełnione są wszystkie poniższe warunki: [...]
Jeśli powiesz, że klasa implementuje interfejs, klasa dziedziczy abstrakcyjne i domyślne metody tego interfejsu . (Oczywiście pominąłem następujące warunki; zobacz szczegóły w specyfikacji. W szczególności nie uważa się , że klasa, która implementuje element interfejsu, odziedziczyła ten element. Ponownie, czy to jest mylące? Tak.)
Czy zazwyczaj mówimy w Javie, że klasa dziedziczy po interfejsie?
Zazwyczaj powiedzielibyśmy, że klasa implementuje interfejs. Jak wspomniano powyżej, klasa może dziedziczyć elementy po interfejsie, a mimo to nie można powiedzieć, że dziedziczy po interfejsie. Co jest mylące, tak.
Czy to subtelne rozróżnienie ma znaczenie w codziennej pracy?
Zazwyczaj nie. Tego rodzaju wąskie analizowanie specyfikacji jest bardziej przydatne dla autorów kompilatorów niż dla programistów biznesowych. Ważniejsze jest, aby zrozumieć, kiedy używać interfejsu, niż uzyskać dokładną definicję „dziedziczy po”.
java
więc jest to prawidłowa odpowiedź, chyba że OP oznaczało inne java
:-)
Dziedziczenie oznacza napisanie nowej podklasy dla nadklasy. Pisanie nowej klasy przeciwko interfejsowi implementuje ten interfejs. (A pisanie nowego interfejsu opartego na starym rozszerza ten interfejs).
Jedynym poprawnym terminem, który dotyczy wszystkich trzech możliwości, jest podtyp . Nie każdy podtyp jest podklasą.
Z podklasami ty
Dzięki interfejsom wypełniasz umowę, wdrażając zadeklarowane metody.
To klasyczny sposób patrzenia na to. Teraz w Javie 8 interfejsy stają się mieszanką:
Czy wdrożenie interfejsu, którego metody mają wszystkie implementacje domyślne, nadal liczy się jako „implement”, czy raczej jako rozszerzenie? Nie mogłem powiedzieć Ponieważ ten przypadek jest dość daleko posunięty (to faktycznie włączyło bezpaństwowe wielokrotne dziedziczenie), nadal używałbym „dziedziczenia” tylko z podklasami.