以下两个有什么区别?
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()
}
}
输出:
我可以飞! :D
&lt;&lt;沉默&gt;&gt;
答案 0 :(得分:5)
在第二种情况下,B不能用于预期A的地方,它只是被设计为“附加”到某个A.所以例如在第一种情况下A可以是抽象的,B可以实现缺少方法,使其成为可实例化的类型。在第二种情况下,这是不可能的,您需要一个“完整的A”,然后才会添加一些功能。
所以你可以想到一个“适合......”的关系,而不是“是......”的关系。
答案 1 :(得分:1)
在第一个示例中,B
是A
的特化。第二个意味着特征B
必须始终混合成A
(可以是类,特征或任何其他类型)的子类型。