7

以下两者有什么区别?

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
<< 沉默>>

4

2 回答 2

5

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

因此,您可以考虑“适合...”关系而不是“是...”关系。

于 2010-07-02T07:17:20.347 回答
1

在第一个示例B中是A. 第二个意味着B必须始终将特征混合到某种东西中,或者是它的子类型A(可以是类、特征或任何其他类型)。

于 2010-07-02T06:30:36.000 回答