누군가 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) {
}
출력 : 목록 (I am Ray , 나는 레이, 나쁜 날입니다! , 나는 레이입니다. 아름다운 날입니다! , 나는 레이, 나쁜 날입니다! , 나는 레이입니다. 아름다운 날입니다! )
이것은 내가 본 최고의 예입니다
실제 스칼라 : 특성 구성 – 레고 스타일 : 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
}
특성은 기능을 클래스에 혼합하는 데 유용합니다. http://scalatest.org/를 살펴보십시오 . 다양한 DSL (도메인 특정 언어)을 테스트 클래스에 혼합하는 방법에 유의하십시오. Scalatest ( http://scalatest.org/quick_start ) 에서 지원하는 DSL 중 일부를 보려면 빠른 시작 가이드를 참조하십시오.
나는 Programming in Scala, First Edition 책의 웹 사이트에서 인용 하고 있으며보다 구체적으로는 12 장의 " To trait, or not to trait? " 섹션을 인용하고있다 .
재사용 가능한 동작 모음을 구현할 때마다 특성 또는 추상 클래스를 사용할 것인지 결정해야합니다. 확실한 규칙은 없지만이 섹션에는 고려해야 할 몇 가지 지침이 포함되어 있습니다.
동작이 재사용되지 않으면 구체적인 클래스로 만드십시오. 결국 재사용 가능한 동작이 아닙니다.
관련되지 않은 여러 클래스에서 재사용 될 수있는 경우 특성으로 만드십시오. 특성 만 클래스 계층 구조의 다른 부분에 혼합 될 수 있습니다.
위의 링크에 특성에 관한 정보가 조금 더 있으며 전체 섹션을 읽어 보시기 바랍니다. 이게 도움이 되길 바란다.