誰かがScalaの特徴を説明できますか?抽象クラスを拡張することに対するトレイトの利点は何ですか?
回答:
簡単に言えば、複数の特性を使用できるということです。それらは「積み重ね可能」です。また、トレイトにコンストラクターパラメーターを含めることはできません。
特性がどのように積み重ねられるかは次のとおりです。特性の順序が重要であることに注意してください。彼らは右から左にお互いを呼びます。
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(http://scalatest.org/quick_start)でサポートされているDSLのいくつかを確認するには、クイックスタートガイドをご覧ください。
私は、 『Programming in Scala、First Edition』という本のWebサイトから引用しています。具体的には、第12章の「特性化するかしないか」というセクションを引用しています。
再利用可能な動作のコレクションを実装するときはいつでも、トレイトまたは抽象クラスのどちらを使用するかを決定する必要があります。確固たるルールはありませんが、このセクションには考慮すべきいくつかのガイドラインが含まれています。
動作が再利用されない場合は、それを具象クラスにします。結局、再利用可能な動作ではありません。
無関係な複数のクラスで再利用される可能性がある場合は、それを特性にします。クラス階層のさまざまな部分に混合できるのは、特性のみです。
特性に関する上記のリンクにはもう少し情報があります。セクション全体を読むことをお勧めします。これがお役に立てば幸いです。