Załóżmy, że chcemy zbudować nową klasę generyczną, Novel[A]
. Ta klasa będzie zawierała wiele użytecznych metod - być może jest to typ kolekcji - i dlatego chcesz ją podklasować. Ale chcesz, aby metody zwracały typ podklasy, a nie typ oryginalny. W Scala 2.8, jaka jest minimalna ilość pracy, którą należy wykonać, aby metody tej klasy zwróciły odpowiednią podklasę, a nie oryginał? Na przykład,Minimalne ramy w Scali dla kolekcji z odziedziczonym typem zwrotu
class Novel[A] /* What goes here? */ {
/* Must you have stuff here? */
def reverse/* What goes here instead of :Novel[A]? */ = //...
def revrev/*?*/ = reverse.reverse
}
class ShortStory[A] extends Novel[A] /* What goes here? */ {
override def reverse: /*?*/ = //...
}
val ss = new ShortStory[String]
val ss2 = ss.revrev // Type had better be ShortStory[String], not Novel[String]
Czy to minimalną zmianę kwoty, jeżeli chcesz Novel
być kowariantna?
(2.8 kolekcje robią to między innymi, ale grają też z typami powrotu w bardziej fantazyjny (i użyteczny) sposób - pytanie brzmi, jak mało ramy można uciec, jeśli chce się tylko tych podtypów - zawsze -return-podtypów.)
Edytuj: Założono w powyższym kodzie, że reverse
tworzy kopię. Jeśli dokonasz modyfikacji w miejscu, a następnie zwrócisz, możesz użyć this.type
, ale to nie działa, ponieważ kopia nie jest this
.
Arjan powiązane z innym pytaniem, które proponuje następujące rozwiązanie:
def reverse: this.type = {
/*creation of new object*/.asInstanceOf[this.type]
}
który zasadniczo polega na systemie typu, aby dostać to, co chcemy. Ale tak naprawdę nie jest to rozwiązanie, ponieważ skoro już okłamywaliśmy system typów, kompilator nie może nam pomóc, abyśmy naprawdę odzyskali do odzyskania wartości ShortStory
, kiedy myślimy, że to robimy. (Na przykład, nie będziemy musieli przesłonić reverse
w powyższym przykładzie, aby kompilator był szczęśliwy, ale nasze typy nie byłyby tym, czego chcieliśmy.)
Prawdopodobnie nie miałeś na myśli typów Singleton Scali jako przykładu minimalnej struktury, którą miałeś na myśli, jak zakładam? W każdym przypadku przykłady online pokazujące, jak można je wykorzystać, można znaleźć na stronie http://scalada.blogspot.com/2008/02/thistype-for-chaining-method-calls.html. Jest także przykład na SO, który pokazuje, jak można produkować niezmienne klasy za pomocą jakiegoś hackery http://stackoverflow.com/questions/775312/why-cannot-this-type-be-used-for-new-instances –
@Arjan - Nie miałem na myśli tego, ponieważ to zbyt ograniczające. (Kopiowanie metod jest zabronione, na przykład.) –