为什么类不能用相同签名的方法扩展特征?
为什么下面的错误? 如何解决它?
编辑:我认为,因为A和B编译到(接口,类)对,这是一个选择正确的静态方法调用来实现编译C时的问题。我希望优先级按照顺序。
scala> trait A {def hi = println("A")} defined trait A scala> trait B {def hi = println("B")} defined trait B scala> class C extends B with A :6: error: error overriding method hi in trait B of type => Unit; method hi in trait A of type => Unit needs `override' modifier class C extends B with A scala> trait A {override def hi = println("A")} :4: error: method hi overrides nothing trait A {override def hi = println("A")}
编辑:请注意,在Ruby中这个效果很好:
>> module B; def hi; puts 'B'; end; end => nil >> module A; def hi; puts 'A'; end; end => nil >> class C; include A; include B; end => C >> c = C.new => # >> c.hi B => nil
这在2.8和2.11中适用于我,并且可以让您在特质A
或B
中非侵入:
trait A { def hi = println("A") }
trait B { def hi = println("B") }
class C extends A with B {
override def hi = super[B].hi
def howdy = super[A].hi // if you still want A#hi available
}
object App extends Application {
(new C).hi // prints "B"
}
你可以使用一个通用的基本特征,比如Base
,如下所示:
trait Base {def hi: Unit}
trait A extends Base {override def hi = println("A")}
trait B extends Base {override def hi = println("B")}
class C extends A with B
使用类型层次结构调用hi
的结果如下(注意使用{}
来实例化特征):
scala> (new A {}).hi
A
scala> (new B {}).hi
B
scala> (new C).hi
B
一个特质为混合它的类增加了方法。如果两个特性添加了相同的方法,那么这个类最终会有两个相同的方法,当然这是不可能发生的。
但是,如果该方法在特质中是私人的,那么它不会造成问题。 如果你想让方法相互叠加,你可以定义一个基础特征,然后对继承特征进行abstract override
。 然而,它需要一个类来定义方法。 这是一个例子:
scala> trait Hi { def hi: Unit }
defined trait Hi
scala> trait A extends Hi { abstract override def hi = { println("A"); super.hi } }
defined trait A
scala> trait B extends Hi { abstract override def hi = { println("B"); super.hi } }
defined trait B
scala> class NoHi extends Hi { def hi = () }
defined class NoHi
scala> class C extends NoHi with B with A
defined class C
scala> new C().hi
A
B
但是,如果你真的想从每个特质中选择两个独立的方法,那么你需要编写而不是继承。
链接地址: http://www.djcxy.com/p/51017.html上一篇: Why can't a class extend traits with method of the same signature?
下一篇: How to show True/False Condition on Branch Coverage on Gcovr