Возможны ли множественные самонаведения?

Я хочу сделать следующее, но строка самонастройки просто не компилируется. У меня этот синтаксис неправильный или это просто невозможно?

trait A {
  def aValue = 1
}
trait B {
  def bValue = 1
}
trait C {
  a : A, b : B =>
  def total = a.aValue + b.bValue
}

class T extends C with A with B { ...

Ответы

Ответ 1

У вас может быть один тип типа, который является составным.

Попробуйте следующее:

trait A {
  def aValue = 1
}
trait B {
  def bValue = 1
}
trait C {
  self: A with B =>
  def total = aValue + bValue
}

class ABC extends A with B with C

Ответ 2

С одним признаком вы можете сделать это с структурным типом:

trait C {
  self: { def aValue: Int
          def bValue: Int } =>

  def total = aValue + bValue
}

class ABC extends C {
  def aValue = 1
  def bValue = 1
}

Используется отражение.

Но, во-первых, вы не должны злоупотреблять самонаборами из-за принципа наименьшей мощности.

Способы из вопроса могут быть добавлены просто путем расширения другого tait:

trait C extends A with B{
  def total = aValue + bValue
}

или явно введите оба метода:

trait C {
  def aValue: Int
  def bValue: Int

  def total = aValue + bValue
}

Где использовать self-types?

Самостоятельные типы обычно используются с классами. Это хороший способ для характеристики, чтобы требовать быть подклассом желаемого класса.

Существует также одно хорошее использование self-type с триатами: когда вы хотите манипулировать порядком инициализации класса с помощью множественного наследования.