在抽象类上使用特征的优点是什么?


Answers:


80

简短的答案是,您可以使用多个特征-它们是“可堆叠的”。同样,特征不能具有构造函数参数。

特征是如何堆叠的。请注意,特征的顺序很重要。他们会从右到左互相呼叫。

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

4
构造函数参数的缺乏几乎是由特征中的类型参数弥补的。
2011年

19

站点提供了使用特征的一个很好的例子。特征的一大优点是您可以扩展多个特征,但只能扩展一个抽象类。特性通过多重继承解决了许多问题,但允许代码重用。

如果您知道红宝石,其特性类似于混合


5
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) {
}
输出:

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




1

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

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

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

性状可以从其他特征或类别中继承。


1

我引用了《编程在Scala中的编程》第一版的网站,更具体地说是引用第12章中的“转换为特征还是不转换为特征? ”部分。

每当实现行为的可重用集合时,都必须决定要使用特征还是抽象类。没有严格的规则,但是本节包含一些要考虑的准则。

如果该行为不会被重用,则使其成为一个具体的类。毕竟这不是可重用的行为。

如果可以在多个不相关的类中重用它,请使其成为特征。只有特征可以混入类层次结构的不同部分。

上面的链接中有关于性状的更多信息,我建议您阅读完整的部分。我希望这有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.