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

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

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 { ...

2 ответа

Решение

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

Попробуй это:

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

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

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

  def total = aValue + bValue
}

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

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

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

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

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

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

trait C {
  def aValue: Int
  def bValue: Int

  def total = aValue + bValue
}

Где использовать самопечатания?

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

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

Другие вопросы по тегам