我有2个特质和1个班级。
在特质A
中,A1
和A2
两种方法都需要实施
scala> trait A {
| def A1
| def A2
| }
defined trait A
在trait B
中,即使A1
在这里实现,它也需要是抽象的,因为它使用了super,它仍然需要在实例类中实现。 A2
已实施
scala> trait B extends A {
| abstract override def A1 = {
| super.A1
| }
| def A2 = println("B")
| }
defined trait B
现在我有一个C
课,它定义A1
(与以前的特征无关)
scala> class C {
| def A1 = println("C")
| }
defined class C
现在我想创建对象C1
,它应该是C
类型,但我想要B
的一些功能(比如说A2
)。但它没有编译。如何在A2
中使用B
中的C
?我认为它会起作用,因为C
已经实现了A1
。
scala> val c1 = new C with B
<console>:13: error: overriding method A1 in class C of type => Unit;
method A1 in trait B of type => Unit cannot override a concrete member without a third member that's overridden by both (this rule is designed to prevent ``accidental overrides'')
val c1 = new C with B
^
答案 0 :(得分:3)
错误会阻止您执行此操作以防止“意外覆盖”。您的A1
方法在B
和C
中定义,但对于编译器,它们是无关的,恰好具有相同的类型签名。因此,您必须在对象中提供此方法的重写实现。你可以这样做:
val c1 = new C with B {
override def A1 = ??? // Add your implementation here.
}