Odpowiedź brzmi "okrągłość". Ale nie tylko.
Adnotacja typu self rozwiązuje dla mnie podstawowy problem dziedziczenia: to, z czego odziedziczysz, nie może używać tego, czym jesteś. Dzięki samemu typowi wszystko staje się łatwe.
mój wzór jest następujący i można go traktować jako zdegenerowanego ciasto:
trait A { self: X => def a = reuseme}
trait B { self: X => def b = a }
class X extends A with B { def reuseme=null }
Możesz wybuchnąć klasę w wielu zachowań, które mogą być wywoływane z dowolnego miejsca w zespole, podczas pobytu czysto wpisane. Nie trzeba zbyt często bolesnego kierowania (i niesłusznie) identyfikować z wzorcem ciasta.
Połowa (jeśli nie całość) zawiłych frameworków Java DI z ostatnich dziesięciu lat została poświęcona temu procesowi, oczywiście bez pisania. Osoby wciąż używające JAVA w tej domenie wyraźnie tracą swój czas: "SCALA ouakbar".
Dokładny duplikat http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait-subclasses, który jest pierwszym pytaniem wyświetlonym na powiązanej liście . –