我想要执行以下操作,但自行类型行无法编译。我有这种语法错误或者这只是不可能吗?
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 { ...
答案 0 :(得分:74)
您可以拥有一个复合类型的自我类型。
试试这个:
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
答案 1 :(得分:3)
使用一个特征,您可以使用结构类型执行此操作:
trait C {
self: { def aValue: Int
def bValue: Int } =>
def total = aValue + bValue
}
class ABC extends C {
def aValue = 1
def bValue = 1
}
使用了反思。
但是,首先你不应该因principle of least power而过度使用自我类型。
可以通过扩展其他文章来添加来自问题的方法:
trait C extends A with B{
def total = aValue + bValue
}
或明确键入两种方法:
trait C {
def aValue: Int
def bValue: Int
def total = aValue + bValue
}
在哪里使用自我类型?
自我类型通常与课程一起使用。这是trait要求成为所需类的子类的好方法。
还有一个很好的使用带有triats的自我类型:当你想用多重继承操纵类初始化的顺序时。