Wydaje się, że najbardziej powszechne stosowanie Scala explicitly-typed self references jest w „Cake pattern”, w którym zależności modułu są zadeklarowane jak:Przydatność wyraźnie wpisany odniesienia własnych w strukturze ciasto
class Foo { this: A with B with C =>
// ...
}
W ogóle, ignorując wzór ciasto przez chwilę, A
, B
i C
może odnosić się do niczego typ poziomu, takich jak parametr typu:
class Outer[A, B, C] {
class Inner { this: A with B with C =>
// ...
}
}
... lub abstrakcyjne członkiem typ:
class Outer {
type A
type B
type C
class Inner { this: A with B with C =>
// ...
}
}
W żadnym z tych przypadków nie mogliśmy zostać napisany abstract class Inner extends A with B with C
, ponieważ A
, B
i C
nie są znane jako cechy. W tym miejscu konieczne jest jawne wpisanie własnych odniesień. Jednak mam tylko widział wzór ciasto zrobione z cech:
trait A { def a }
trait B { def b }
trait C { def c }
class Foo { this: A with B with C =>
// ...
}
w tym przypadku, możemy zamiast pisać abstract class Foo extends A with B with C
bezpośrednio, które, jeśli się nie mylę ma takie samo znaczenie. Mam rację? Jeśli nie, to jak się różnią; a jeśli tak, to dlaczego wszyscy wydają się używać samodzielnie wpisanego samo-odniesienia?
możliwe duplikat [Jaka jest różnica między Scala samodzielnych typów i podklasy cecha?] (Http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self -types-and-trait-subclasses) – sschaef
@sschaef inne pytanie, ale jeden z komentarzy Daniela pod jego odpowiedzią może być odpowiedzią, której szukam ... Wydaje się być analogicznym do "publicznego" dziedziczenia vs. dziedziczenie w C++? – mergeconflict
Dla mnie oba pytania wydają się chcieć znać to samo - różnią się między sobą klasami abstrakcyjnymi a cechami, które mają ten sam kierunek. Czy też zasadniczo zrozumiałem, że coś jest nie tak? – sschaef