以下两个有什么区别?
1#
trait B extends A {
}
2#
trait B { self: A =>
}
哪里
A
是一个抽象类。>> 编辑:
请就以下
Duck
的例子进行说明s 具有可插拔的飞行和嘎嘎行为:abstract class Duck {
def fly(): Unit
def quack(): Unit
def swim() {
println("Woodoowoodoowoodoo...")
}
}
trait FlyingWithWings extends Duck {
override def fly() {
println("Me can fliez! :D")
}
}
trait FlyingNoWay { self: Duck =>
def fly() {
println("Me cannot fliez! :(")
}
}
trait Quack extends Duck {
override def quack() {
println("Quack! Quack!")
}
}
trait MuteQuack { self: Duck =>
def quack() {
println("<< Silence >>")
}
}
class MallardDuck extends Duck with FlyingWithWings with MuteQuack
object Main {
def main(args: Array[String]) {
val duck = new MallardDuck
duck.fly()
duck.quack()
}
}
输出:
Me can fliez! :D
<< Silence >>
最佳答案
在第二种情况下,B 不能用于需要 A 的地方,它只是被设计为“附加”到某个 A。例如,在第一种情况下,A 可能是抽象的,而 B 可以实现缺少的方法,使其成为可实例化的类型。在第二种情况下这是不可能的,您需要一个“完整的 A”,然后才添加一些功能。
因此,您可以考虑“适合……”关系而不是“是……”关系。
关于scala - 关于特质的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163648/