scala - 关于特质的问题

标签 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()
  }
}

输出:

Me can fliez! :D
<< Silence >>

最佳答案

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

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

关于scala - 关于特质的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3163648/

相关文章:

scala - IntelliJ Play2 和 Scala 插件不兼容。使 IntelliJ 12 不再按预期工作

scala - 为什么 Scala Option.tapEach 返回 Iterable,而不是 Option?

function - Scala 函数文字中的 `return`

unit-testing - 当 PartialEq 的实现不合适时,如何断言两个变量相等?

c++ - C++中忽略的特征特化

scala - 在 scala 特征子类中创建时执行代码

java - 当消息大小非常大(例如〜100mb)时,生产者(java客户端)的性能会下降

scala - 编译Play Framework项目时出现"IO error while decoding Routes.scala with UTF-8"

grails - @Enhances Grails Controller

perl - 我可以订购作为特征一部分加载的方法修饰符吗?