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