2013-04-28 8 views
10

Dzisiaj chciałem dowiedzieć się o supertypes z List:Przegrana w wykresie spadku zbiorów Scala

sealed abstract class List[+A] extends AbstractSeq[A] 
            with LinearSeq[A] 
            with Product 
            with GenericTraversableTemplate[A, List] 
            with LinearSeqOptimized[A, List[A]] 

Wow, tak List ma już pięć natychmiastowe supertypes. Załóżmy, wybrać jedną losowo:

trait LinearSeq[+A] extends Seq[A] 
         with scala.collection.LinearSeq[A] 
         with GenericTraversableTemplate[A, LinearSeq] 
         with LinearSeqLike[A, LinearSeq[A]] 

Okay, wybrać jedną z najbardziej podobnej nazwie:

trait LinearSeqLike[+A, +Repr <: LinearSeqLike[A, Repr]] extends SeqLike[A, Repr] 

Ach, wydaje się że jesteśmy coraz gdzieś tylko jeden supertypem lewej:

trait SeqLike[+A, +Repr] extends Any 
          with IterableLike[A, Repr] 
          with GenSeqLike[A, Repr] 
          with Parallelizable[A, ParSeq[A]] 

W tym momencie poddałem się. Jak głęboki jest ten wykres? Które z tych supertypów są koncepcyjnie istotne, a które z nich to tylko szczegóły dotyczące implementacji lub sztuczki optymalizacyjne?

Jak ma sens taki ogromny wykres dziedziczenia?

+1

Cóż, najpierw upewnij się, że masz racje żelaza, latarka, a dziesięć stóp słup, a potem zejść, grzebie w rzeczach, aby upewnić się, że nie są pułapką .... Więcej poważnie, hierarchia jest ogromna kolekcje i większość z nich faktycznie robi coś koncepcyjnie. To nie jest łatwe. Przynajmniej większość typów wyjaśnia teraz na górze swoich dokumentów, do czego służą. (Chodzi o kolejne trzy lub cztery poziomy, zanim odkryjesz coś takiego jak "GenTraversableOnce".) –

+0

Jeśli interesujesz się tylko częściami interfejsu API kolekcji (lub rozgrzewaniem przed obejrzeniem wnętrza), dobrym początkiem jest ta grupa wykresów dziedziczenia: http://www.decodified.com/scala/collections-api.xml; nie jest całkowicie aktualny, ale na szczęście nie stał się jeszcze przestarzały. – gourlaysama

+0

@gourlaysama To są ładne diagramy, ale nie mogę znaleźć 'AbstractSeq',' Product', 'GenericTraversableTemplate',' LinearSeqOptimized', 'LinearSeqLike',' SeqLike', 'IterableLike',' GenSeqLike' lub 'Parallelizable'. .. – fredoverflow

Odpowiedz

6

Większość rodziców to w rzeczywistości szczegóły implementacji i triki optymalizacyjne. Jeśli nie dbasz o to, możesz zignorować wszystko na końcu pod Like lub Template. Stosując to do list, mamy: List <: LinearSeq <: Seq <: Iterable <: Traversable. Powinieneś używać tych cech jako typów argumentów w swoim kodzie (zamiast cech implementacji). Zostały one opisane w: Scala Collections API

Jeśli chcesz zrozumieć, w jaki sposób wykorzystywane są cechy implementacji lub zaprojektować własne kolekcje, przeczytaj ten samouczek: The Architecture of Scala Collections.

Ponadto, jeśli chcesz/musisz wiedzieć, gdzie dana metoda jest faktycznie zaimplementowana, kliknij podpis metody w scaladoc, aby rozwinąć opis de. Pole Definition Classes wyświetla łącza do lokalizacji implementacji.

+1

I okazało się, nauczyłem się sporo poprzez rozszerzenie na metodę i spójrz na * klasy definicji *. Na przykład dla 'List.isEmpty' wyświetli on * SeqLike → IterableLike → TraversableLike → TraversableOnce → GenTraversableOnce *. Mogę wykonać "SeqLike" i dowiedzieć się więcej na ten temat. Mogę następnie kliknąć SeqLike.scala i sprawdzić kod źródłowy ... – huynhjl

1

Gdy osiągnął SeqLike, jesteś prawie tam - IterableLike ma tylko GenIterableLike i TraversableLike nad nim, TraversableLike ma tylko TraversableOnce i GenTraversableLike powyżej.

I TraversableOnce ma GenTraversableOnce nad nim, i to wszystko :)

Łącze że inny użytkownik warunkiem (również http://docs.scala-lang.org/overviews/collections/overview.html) jest dobrym odniesienia - po prostu trzeba wiedzieć, że każdy z tych typów posiada odpowiadający *Like typ, który przechowuje parametr typu prezentacji Repr.

Jednak z punktu widzenia rozszerzania kolekcji wystarczy znaleźć najbardziej typ, który chcesz przedłużyć w większości przypadków, na przykład SeqLike i rozszerzyć Seq[T] i Seq[T, YourCollectionType[T]].

W przyszłych wersjach Scala można usunąć cechy Gen*, co upraszcza hierarchię.

0

Istnieje nice overview z hierarchii klas kolekcji na scala-lang.org.

+0

To są ładne diagramy, ale nie mogę znaleźć 'AbstractSeq '' Product', 'GenericTraversableTemplate',' LinearSeqOptimized', 'LinearSeqLike',' SeqLike', 'IterableLike',' lub 'Parallelizable' GenSeqLike' tam ... – fredoverflow