有人可以解释Scala的特征吗?与扩展抽象类相比,特征有什么优势?
有人可以解释Scala的特征吗?与扩展抽象类相比,特征有什么优势?
Answers:
简短的答案是,您可以使用多个特征-它们是“可堆叠的”。同样,特征不能具有构造函数参数。
特征是如何堆叠的。请注意,特征的顺序很重要。他们会从右到左互相呼叫。
class Ball {
def properties(): List[String] = List()
override def toString() = "It's a" +
properties.mkString(" ", ", ", " ") +
"ball"
}
trait Red extends Ball {
override def properties() = super.properties ::: List("red")
}
trait Shiny extends Ball {
override def properties() = super.properties ::: List("shiny")
}
object Balls {
def main(args: Array[String]) {
val myBall = new Ball with Shiny with Red
println(myBall) // It's a shiny, red ball
}
}
package ground.learning.scala.traits
/**
* Created by Mohan on 31/08/2014.
*
* Stacks are layered one top of another, when moving from Left -> Right,
* Right most will be at the top layer, and receives method call.
*/
object TraitMain {
def main(args: Array[String]) {
val strangers: List[NoEmotion] = List(
new Stranger("Ray") with NoEmotion,
new Stranger("Ray") with Bad,
new Stranger("Ray") with Good,
new Stranger("Ray") with Good with Bad,
new Stranger("Ray") with Bad with Good)
println(strangers.map(_.hi + "\n"))
}
}
trait NoEmotion {
def value: String
def hi = "I am " + value
}
trait Good extends NoEmotion {
override def hi = "I am " + value + ", It is a beautiful day!"
}
trait Bad extends NoEmotion {
override def hi = "I am " + value + ", It is a bad day!"
}
case class Stranger(value: String) {
}
输出: 清单(我是雷 ,我是雷,这是糟糕的一天! ,我是雷,这是美好的一天! ,我是雷,这是糟糕的一天! ,我是雷,这是美好的一天! )
这是我见过的最好的例子
实践中的Scala:作曲-乐高风格:http: //gleichmann.wordpress.com/2009/10/21/scala-in-practice-composed-traits-lego-style/
class Shuttle extends Spacecraft with ControlCabin with PulseEngine{
val maxPulse = 10
def increaseSpeed = speedUp
}
特性对于将功能混合到一个类中很有用。看一下http://scalatest.org/。请注意如何将各种特定于域的语言(DSL)混合到测试类中。查看快速入门指南,以查看Scalatest支持的某些DSL(http://scalatest.org/quick_start)
我引用了《编程在Scala中的编程》第一版的网站,更具体地说,是引用第12章中的“转换为特征还是不转换为特征? ”部分。
每当实现行为的可重用集合时,都必须决定要使用特征还是抽象类。没有严格的规则,但是本节包含一些要考虑的准则。
如果该行为不会被重用,则使其成为一个具体的类。毕竟这不是可重用的行为。
如果可以在多个不相关的类中重用它,请使其成为特征。只有特征可以混入类层次结构的不同部分。
上面的链接中有关于性状的更多信息,我建议您阅读完整的部分。我希望这有帮助。