2012-07-16 17 views
7

Istnieje kilka relacji dziedziczenia w interfejsach kolekcji Java. Na przykład interfejs Collection<T> rozszerzy się na Iterable<T>. Sprawdziłem kod źródłowy w JDK, niektóre metody zdefiniowane w klasie bazowej powtarzają się w podklasach kilka razy. Na przykład: Interable<T> interfejs zdefiniowano metodę Iterator<E> iterator(); Ale w interfejsie Collection<E> i List<T>, również zawierają tę samą metodę. W moim rozumieniu, skoro dziedziczenie jest używane do ograniczenia duplikacji, dlaczego mielibyśmy zdefiniować tę samą metodę w podklasach? InterfejsDziedziczenie w interfejsach kolekcji java

Odpowiedz

0

został wprowadzony później: since 1.5. Więc wcześniej do tej wersji tylko podklasy java.util.Collection używane do implementacji iterator().

Później iterator() został standardem, wprowadzając interfejs Iterable, tak że każda klasa, która może iterować, może zaimplementować ten interfejs.

Po wprowadzeniu interfejsu Iterable interfejs Collection został również rozszerzony o interfejs Iterable, dzięki czemu interfejs Collection implementuje również interfejs standardowy.

Ex,

  • java.sql.SQLException realizuje również iterable
+1

Od kiedy odnosi się do interfejsów, nie ma nadrzędnego znaczenia. – Thomas

5

Zobacz w java.util.List

„Interfejs Lista umieszcza dodatkowe postanowienia, poza wymienionymi w interfejsie zbiórki, w kontrakty metod iteratora, dodawania, usuwania, równań i hashCode. Deklaracje dotyczące innych dziedziczonych metod są również e dla wygody. "

+1

+1 W rzeczywistości zgaduję, że powody redeclaring tych metod są (jako cytat, który wysłałeś stany): 1. możliwość dodawania różnych komentarzy JavaDoc (tj. Umów, które są wymienione) i 2. dla wygody dostarczenia szybki przegląd dostępnych metod. – Thomas

1

Collection ukazał się w wydaniu 1.2, ale Iterable wyszedł potem w wydaniu 1.5, aby umożliwić zwięzłe for-pętle, więc myślę, że to był przypadek utrzymanie interfejs Collection i Javadocs samo pomiędzy wersjami. Ale masz rację, nie ma powodu, aby nie można było usunąć metody iterator() z Collection, wszystko by się jeszcze skompilowało.

1

Interfejs Collection Interfejs rozciąga się na:Iterable. Klasa abstrakcyjna abstrakcyjna implementuje metody wspólne dla kilku klas, w przypadku list jest to AbstractList, z każdą klasą betonu (powiedzmy, ArrayList lub LinkedList) dostarczającą szczegółowe szczegóły implementacji.

W rzeczywistości, jak można się domyślić, dziedziczenie służy do ograniczenia duplikacji kodu. Ale właśnie z tego powodu wszystkie podklasy będą zawierały te same operacje zdefiniowane w nadklasach, szczegóły implementacji wspólne dla kilku klas pojawią się tylko raz w hierarchii klas na abstrakcyjnym poziomie klasy, i nie są "zdefiniowane" ponownie w klasie. podklasy - tylko części, które się zmieniają, są przedefiniowane w konkretnych podklasach.