추상 수업을 통해 특성을 사용하는 장단점은 무엇입니까?
문제
누군가 스칼라의 특성을 설명해 주시겠습니까? 추상 클래스를 확장하는 특성의 장점은 무엇입니까?
해결책
짧은 대답은 여러 특성을 사용할 수 있다는 것입니다. "쌓을 수 있습니다". 또한 특성은 생성자 매개 변수를 가질 수 없습니다.
특성이 쌓이는 방법은 다음과 같습니다. 특성의 순서가 중요합니다. 그들은 오른쪽에서 왼쪽으로 서로에게 전화 할 것입니다.
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) {
}
Output : List(I am Ray , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! )
이것은 내가 본 가장 좋은 예입니다
실제로 스칼라 : 특성 작곡 - 레고 스타일 :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의 지원되는 DSL 중 일부를 보려면 빠른 시작 가이드를보십시오 ( http://scalatest.org/quick_start )
Java의 인터페이스와 유사하게, 특성은 지원되는 방법의 서명을 지정하여 객체 유형을 정의하는 데 사용됩니다.
Java와 달리 Scala는 특성을 부분적으로 구현할 수 있도록합니다. 즉 일부 방법에 대한 기본 구현을 정의 할 수 있습니다.
클래스와 달리 특성에는 생성자 매개 변수가 없을 수 있습니다. 특성은 클래스와 같지만 클래스가 구체적인 값과 구현을 제공 할 수있는 함수 및 필드의 인터페이스를 정의합니다.
특성은 다른 특성이나 수업에서 물려받을 수 있습니다.
나는 책의 웹 사이트에서 인용하고있다 스칼라의 프로그래밍, 초판 더 구체적으로 "섹션은"특성을 제외하고는 특성에?"12 장부터.
재사용 가능한 행동 모음을 구현할 때마다 특성 또는 추상 클래스를 사용할지 여부를 결정해야합니다. 확실한 규칙은 없지만이 섹션에는 고려해야 할 몇 가지 지침이 포함되어 있습니다.
동작이 재사용되지 않으면 구체적인 클래스로 만드십시오. 결국 재사용 가능한 행동이 아닙니다.
관련없는 여러 클래스에서 재사용 할 수 있다면 특성으로 만드십시오. 특성 만 클래스 계층 구조의 다른 부분에 혼합 될 수 있습니다.
위의 링크에는 특성과 관련하여 조금 더 많은 정보가 있으며 전체 섹션을 읽는 것이 좋습니다. 이게 도움이 되길 바란다.