Ответ 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
Я хочу сделать следующее, но строка самонастройки просто не компилируется. У меня этот синтаксис неправильный или это просто невозможно?
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 { ...
У вас может быть один тип типа, который является составным.
Попробуйте следующее:
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
}
Используется отражение.
Но, во-первых, вы не должны злоупотреблять самонаборами из-за принципа наименьшей мощности.
Способы из вопроса могут быть добавлены просто путем расширения другого 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 с триатами: когда вы хотите манипулировать порядком инициализации класса с помощью множественного наследования.