对抽象类使用特征有什么优点?

有人可以解释斯卡拉的特征吗? 与扩展抽象类相比,特质有什么优点?

简单的答案是你可以使用多种特性 – 它们是“可堆叠的”。 另外,特征不能有构造器参数。

这是性格如何堆叠。 注意特征的顺序是重要的。 他们会从右到左互相打电话。

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 } } 

这个网站给出了一个很好的特征使用的例子。 性状的一大优点是可以扩展多个特征,但只能扩展一个抽象类。 性状解决了多重inheritance的许多问题,但允许代码重用。

如果你知道ruby,那么特性与混入相似

这是我见过的最好的例子

实践中的斯卡拉:作曲特质 – 乐高风格: 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 } 
 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) { } 
输出:

名单(我是雷
 ,我是雷,这是一个糟糕的一天!
 ,我是雷,这是美好的一天!
 ,我是雷,这是一个糟糕的一天!
 ,我是雷,这是美好的一天!
 )

特性对于将function混合到一个类中是有用的。 看看http://scalatest.org/ 。 注意如何将不同的领域特定语言(DSL)混合到一个testing类中。 查看快速入门指南,查看一些Scalatest支持的DSL( http://scalatest.org/quick_start

类似于Java中的接口,通过指定所支持方法的签名来使用特征来定义对象types。

与Java不同,Scala允许部分实现特性; 即可以为某些方法定义默认实现。

与类相反,特征可能没有构造函数参数。 特性就像类一样,但它定义了一些函数和字段的接口,类可以提供具体的值和实现。

特质可以从其他特征或类inheritance。

我是从第一版Scala编程书籍的网站引用的,更具体地说,是从第12章中的“ 为了特质,还是不要特质? ”一节而引用的。

每当你实现一个可重用的行为集合,你将不得不决定是否要使用一个特质或一个抽象类。 没有确定的规则,但本节包含一些要考虑的指导原则。

如果行为不会被重用,那就把它作为一个具体的类。 毕竟这不是可重用的行为。

如果它可能被重复使用在多个不相关的类中,那就把它作为一个特征。 只有特质可以混合到类层次结构的不同部分。

上面的链接中有关于性状的更多信息,我build议你阅读完整章节。 我希望这有帮助。