我正在尝试定义特征C
,该特征扩展了一些特征A
,B
,......所有特征,C
和A
,{ {1}},...实现共同特征B
。特质T
应该通过调用C
,T
,T
中的A
的实现来实现B
:
trait T{
def f()
}
trait A extends T{
def f(){
print("A")
}
}
trait B extends T{
def f(){
print("B")
}
}
特质C
的期望行为如下:
val x=new A with B with C[A,B]{}
x.f()
// should produce output
A
B
这里我试图定义特征C,它给出了编译错误:
trait C[A<:T,B<:T] extends T{
self:A with B =>
override def f(){
// error: A does not name a parent class of trait C
super[A].f()
// error: B does not name a parent class of trait C
super[B].f()
}
}
我需要在C
方法A.f()
和B.f()
内进行通话。
这有什么解决方案吗?
答案 0 :(得分:2)
如果要在特征内部提供实现,但也要确保子类实现定义,则可以使用abstract override
组合告诉编译器:
trait T {
def f()
}
trait A extends T {
abstract override def f() {
super.f()
print("A")
}
}
trait B extends T {
abstract override def f() {
super.f()
print("B")
}
}
trait C extends T {
override def f() {
// do your work here ...
}
}
val x = new C with A with B
x.f()
要调用mixin层次结构中的下一个实现,您必须在super.f()
方法调用中添加abstract override
调用。因为这样的超级调用需要现有的实现,所以您需要创建的第一件事是C
混合A
和B
的实例。如果你在C
或A
中混合B
,编译器会抱怨,因为mixin-hierarchy从左到右执行,因此无法看到C
的实现。