有人可以请解释斯卡拉特质? 有什么特质的延伸超过一个抽象类的优势是什么?
Answer 1:
简短的回答是,你可以使用多个特征 - 他们是“堆叠”。 另外,特征不能有构造函数的参数。
这里的特点是如何堆叠。 请注意,特征的顺序是非常重要的。 向左他们会打电话给对方右。
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
}
}
Answer 2:
该网站提供了特性使用的一个很好的例子。 性状的一个大好处是,你可以扩展多个性状,但只有一个抽象类。 性状解决许多与多重继承的问题,但允许代码重用。
如果你知道红宝石,特征类似于混合插件
Answer 3:
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) {
}
Output : List(I am Ray , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! )
Answer 4:
这是我见过的最好的例子
斯卡拉在实践中:撰写特征-乐高风格: http://gleichmann.wordpress.com/2009/10/21/scala-in-practice-composing-traits-lego-style/
class Shuttle extends Spacecraft with ControlCabin with PulseEngine{
val maxPulse = 10
def increaseSpeed = speedUp
}
Answer 5:
特点是混合功能集成到一类是有用的。 看看http://scalatest.org/ 。 注意:你怎么能在不同的领域特定语言(DSL)混合到一个测试类。 看看快速入门指南看一些DSL的精选由Scalatest支持( http://scalatest.org/quick_start )
Answer 6:
类似于Java接口,特点是使用指定的受支持的方法签名来定义对象类型。
与Java,斯卡拉允许特征被部分地实现; 也就是说,它可以定义默认实现的一些方法。
相比之下上课,性状可能没有构造函数的参数。 性状是像类,但它们限定的那类可以提供具体的值和实现功能和字段的接口。
性状可以从其他性状或类继承。
Answer 7:
我在斯卡拉,第一版本书编程和更具体的部分网站被称为“报价为特质,还是不特质? ”从第12章。
当你执行行为的可重复使用的集合,你将不得不决定是否要使用一个特质或抽象类。 没有严格的规定,但是本节包含了一些准则,以考虑。
如果该行为将不被重用,然后使它的具体类。 它毕竟不是可重复使用的行为。
如果可能在多个不相关的类可以重复使用,使它成为一个特质。 只有特质可以混入类层次结构的不同部分。
是在关于特质上面的链接更多的信息,我建议你阅读完整的部分。 我希望这有帮助。