누군가 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 중 일부를 보려면 빠른 시작 가이드를 참조하십시오.
답변
Java의 인터페이스와 유사하게 트레이 트는 지원되는 메소드의 서명을 지정하여 객체 유형을 정의하는 데 사용됩니다.
Java와 달리 Scala는 트레이 트를 부분적으로 구현할 수 있습니다. 즉, 일부 메소드에 대한 기본 구현을 정의 할 수 있습니다.
클래스와 달리 트레이 트에는 생성자 매개 변수가 없을 수 있습니다. 특성은 클래스와 비슷하지만 클래스가 구체적인 값과 구현을 제공 할 수있는 함수 및 필드의 인터페이스를 정의합니다.
특성은 다른 특성이나 클래스에서 상속 할 수 있습니다.
답변
나는 Programming in Scala, First Edition 책의 웹 사이트에서 인용 하고 있으며보다 구체적으로는 12 장의 ” To trait, or not to trait? ” 섹션을 인용하고있다 .
재사용 가능한 동작 모음을 구현할 때마다 특성 또는 추상 클래스를 사용할 것인지 결정해야합니다. 확실한 규칙은 없지만이 섹션에는 고려해야 할 몇 가지 지침이 포함되어 있습니다.
동작이 재사용되지 않으면 구체적인 클래스로 만드십시오. 결국 재사용 가능한 동작이 아닙니다.
관련되지 않은 여러 클래스에서 재사용 될 수있는 경우 특성으로 만드십시오. 특성 만 클래스 계층 구조의 다른 부분에 혼합 될 수 있습니다.
위의 링크에 특성에 관한 정보가 조금 더 있으며 전체 섹션을 읽어 보시기 바랍니다. 이게 도움이 되길 바란다.