Общая черта "вложенных членов" - PullRequest
2 голосов
/ 28 июня 2019

Я строю класс, состоящий из нескольких признаков, одна из которых предоставляет возможность включить список «членов» класса:

trait WithNestedMembers[T] {
  val members = new scala.collection.mutable.ListBuffer[T]
}

class MainClass extends WithNestedMembers[MainClass] {
  // ...
}

Кажется, это работает нормально.

Теперь я бы хотел использовать возможность «вложения» в других чертах:

trait NestingUser {
  this: WithNestedMembers[NestingUser] =>
  var nestedValue = 0
  def sumNested = nestedValue + members.map(_.nestedValue).sum
}

Определение, кажется, работает само по себе. Однако я не могу использовать это как часть MainClass. Следующее дает ошибку:

class MainClass extends WithNestedMembers[MainClass] with NestingUser {
  // Illegal inheritance, self-type MainClass does not conform to WithNestedMembers[NestingUser]
}

Я подозреваю, что мне нужно где-то использовать какие-то границы типов, чтобы объяснить, что WithNestedMembers[MainClass] достаточно для требования WithNestedMembers[NestingUser]. Но где?

1 Ответ

4 голосов
/ 28 июня 2019

Попытка сделать T ковариантным с +T, вот так

trait WithNestedMembers[+T] {
  val members = List.empty[T]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...