추상 수업을 통해 특성을 사용하는 장단점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1229743

  •  22-07-2019
  •  | 
  •  

문제

누군가 스칼라의 특성을 설명해 주시겠습니까? 추상 클래스를 확장하는 특성의 장점은 무엇입니까?

도움이 되었습니까?

해결책

짧은 대답은 여러 특성을 사용할 수 있다는 것입니다. "쌓을 수 있습니다". 또한 특성은 생성자 매개 변수를 가질 수 없습니다.

특성이 쌓이는 방법은 다음과 같습니다. 특성의 순서가 중요합니다. 그들은 오른쪽에서 왼쪽으로 서로에게 전화 할 것입니다.

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 장부터.

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

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

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

위의 링크에는 특성과 관련하여 조금 더 많은 정보가 있으며 전체 섹션을 읽는 것이 좋습니다. 이게 도움이 되길 바란다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top