繁体   English   中英

无法覆盖Scala中的方法

[英]unable to override a method in Scala

我有2个特质和1个班级。

在特征A ,方法A1A2需要实现

scala> trait A {
     | def A1
     | def A2
     | }
defined trait A

在特征B ,即使在这里实现了A1 ,它也必须是抽象的,因为它使用了super并且仍然需要在实例类中实现。 实施A2

scala> trait B extends A {
     | abstract override def A1 = {
     | super.A1
     | }
     | def A2 = println("B")
     | }
defined trait B

现在我有一个定义A1 C类(与以前的特性无关)

scala> class C {
     | def A1 = println("C")
     | }
defined class C

现在,我想创建对象C1 ,它应该是C类型,但是我也想要B某些功能(例如A2 )。 但是它不能编译。 如何在C使用B中的A2 我认为这会起作用,因为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
                    ^

该错误会阻止您执行此操作,以防止发生“意外覆盖”。 您的A1方法是在BC定义的,但对于编译器而言,它们是不相关的,并且恰好具有相同的类型签名。 因此,您必须在对象中提供此方法的主要实现。 您可以这样做:

val c1 = new C with B {
  override def A1 = ??? // Add your implementation here.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM