82

誰かが Scala の特徴を説明してくれませんか? 抽象クラスの拡張に対する特性の利点は何ですか?

4

7 に答える 7

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
  }
}
于 2009-08-04T21:50:04.573 に答える
19

このサイトは、特性の使用法の良い例を示しています。トレイトの大きな利点の 1 つは、複数のトレイトを拡張できますが、抽象クラスは 1 つしか拡張できないことです。トレイトは、多重継承に関する多くの問題を解決しますが、コードの再利用を可能にします。

ruby を知っているなら、trait は mix-in に似ています

于 2009-08-04T21:50:20.157 に答える
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) {
}
出力:

リスト(私はレイです
、私はレイです、それは悪い日です!
、私はレイです、それは美しい日です!
、私はレイです、それは悪い日です!
、私はレイです、それは美しい日です!
)

于 2014-08-30T23:29:34.103 に答える
4

これは私が見た中で最高の例です

実際の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
    }
于 2012-07-09T12:30:45.317 に答える
3

トレイトは、クラスに機能を混在させるのに役立ちます。http://scalatest.org/を見てください。さまざまなドメイン固有言語 (DSL) をテスト クラスに混在させる方法に注意してください。クイック スタート ガイドを参照して、Scalatest でサポートされている DSL の一部を確認してください ( http://scalatest.org/quick_start ) 。

于 2012-12-18T03:32:08.813 に答える