Ваш вопрос, по-видимому, исключает простое наследование.Для A
тип self не имеет преимуществ по сравнению с class A extends T
.Для B
, если вы намереваетесь создать его только в том виде, в котором оно написано, то есть с self = this
, extends также хорош (и намного проще)
Я не думаю, что их так много используютслучай для собственного типа (но это не обсуждение композиции против наследования)
Один из них заключается в том, чтобы заставить признак быть экземпляром только как подтип другого типа, еще не известного, потому что он выглядит как типпараметр или член абстрактного типа.Например, trait X[A] {self: A => ...}
Вы можете взглянуть на этот реалистичный пример на сайте scala с типом member.
Другой случай, когда вы создаете модули, а не экземпляры, в частности, когда у модуля есть члены типа, что делает композицию выполнимой только во время компиляции.Это более или менее связано с CakePattern.
Композиция (с абстрактным значением val или параметром конструктора), безусловно, имеет сильное преимущество в том, что вы можете передавать внешний экземпляр T, делить его между различными экземплярами B, выбирать его гораздо более динамично.экземпляры могут передаваться и возвращаться из функций, миксины не могут