Я бы предпочел использовать последствия.
те предположим, что я хочу создать черту, которую я могу смешать с любым Traversable [T]. В конце я хочу сказать что-то вроде:
val m = Map("name" -> "foo") with MoreFilterOperations
и иметь методы для MoreFilterOperations, которые выражены во всем, что может предложить Traversable, например:
def filterFirstTwo(f: (T) => Boolean) = filter(f) take 2
Однако проблема состоит в том, что T не определен как параметр типа в MoreFilterOperations. Как только я это сделаю, это, конечно, выполнимо, но тогда мой код будет выглядеть так:
val m = Map("name" -> "foo") with MoreFilterOperations[(String,String)]
или если я определю переменную этого типа:
var m2: Map[String,String] with MoreFilterOperations[(String,String)] = ...
которыйспособ многословия на мой вкус. Я хотел бы, чтобы черта была определена таким образом, чтобы я мог написать последнее как:
var m2: Map[String,String] with MoreFilterOperations
Я пробовал собственные типы, члены абстрактных типов, но это не принесло ничего полезного. Есть какие-нибудь подсказки?