关于特质的问题

时间:2010-07-02 06:27:40

标签: scala traits

以下两个有什么区别?

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;

2 个答案:

答案 0 :(得分:5)

在第二种情况下,B不能用于预期A的地方,它只是被设计为“附加”到某个A.所以例如在第一种情况下A可以是抽象的,B可以实现缺少方法,使其成为可实例化的类型。在第二种情况下,这是不可能的,您需要一个“完整的A”,然后才会添加一些功能。

所以你可以想到一个“适合......”的关系,而不是“是......”的关系。

答案 1 :(得分:1)

在第一个示例中,BA的特化。第二个意味着特征B必须始终混合成A(可以是类,特征或任何其他类型)的子类型。