추상 클래스보다 특성을 사용하는 장점은 무엇입니까?


81

누군가 Scala의 특성을 설명해 주시겠습니까? 추상 클래스를 확장하는 것에 비해 트레이 트의 장점은 무엇입니까?

답변:


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
  }
}

4
생성자 매개 변수의 부족은 거의 특성에서 유형 매개 변수를 사용하여 구성됩니다.
Jus12

19

사이트 는 특성 사용의 좋은 예를 제공합니다. 특성의 큰 장점 중 하나는 여러 특성을 확장 할 수 있지만 하나의 추상 클래스 만 확장 할 수 있다는 것입니다. 특성은 다중 상속으로 많은 문제를 해결하지만 코드 재사용을 허용합니다.

루비를 아시면 믹스 인과 비슷한 특성


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) {
}
출력 :

목록 (I am Ray
, 나는 레이, 나쁜 날입니다!
, 나는 레이입니다. 아름다운 날입니다!
, 나는 레이, 나쁜 날입니다!
, 나는 레이입니다. 아름다운 날입니다!
)




1

Java의 인터페이스와 유사하게 트레이 트는 지원되는 메소드의 서명을 지정하여 객체 유형을 정의하는 데 사용됩니다.

Java와 달리 Scala는 트레이 트를 부분적으로 구현할 수 있습니다. 즉, 일부 메소드에 대한 기본 구현을 정의 할 수 있습니다.

클래스와 달리 트레이 트에는 생성자 매개 변수가 없을 수 있습니다. 특성은 클래스와 비슷하지만 클래스가 구체적인 값과 구현을 제공 할 수있는 함수 및 필드의 인터페이스를 정의합니다.

특성은 다른 특성이나 클래스에서 상속 할 수 있습니다.


1

나는 Programming in Scala, First Edition 책의 웹 사이트에서 인용 하고 있으며보다 구체적으로는 12 장의 " To trait, or not to trait? " 섹션을 인용하고있다 .

재사용 가능한 동작 모음을 구현할 때마다 특성 또는 추상 클래스를 사용할 것인지 결정해야합니다. 확실한 규칙은 없지만이 섹션에는 고려해야 할 몇 가지 지침이 포함되어 있습니다.

동작이 재사용되지 않으면 구체적인 클래스로 만드십시오. 결국 재사용 가능한 동작이 아닙니다.

관련되지 않은 여러 클래스에서 재사용 될 수있는 경우 특성으로 만드십시오. 특성 만 클래스 계층 구조의 다른 부분에 혼합 될 수 있습니다.

위의 링크에 특성에 관한 정보가 조금 더 있으며 전체 섹션을 읽어 보시기 바랍니다. 이게 도움이 되길 바란다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.