Обновление. Основное отличие состоит в том, что самонастройки могут зависеть от multiple классов (я допускаю, что это бит-код). Например, вы можете иметь
class Person {
//...
def name: String = "...";
}
class Expense {
def cost: Int = 123;
}
trait Employee {
this: Person with Expense =>
// ...
def roomNo: Int;
def officeLabel: String = name + "/" + roomNo;
}
. Это позволяет добавить микс Employee
только к любому подклассу Person
и Expense
. Конечно, это имеет смысл только в том случае, если Expense
распространяется Person
или наоборот. Дело в том, что использование self-types Employee
может быть независимым от иерархии классов, от которых он зависит. Он не заботится о том, что расширяет то, что - если вы переключите иерархию Expense
vs Person
, вам не нужно изменять Employee
.