Tour of Scala

트레잇

Language

트레잇은 클래스간에 인터페이스와 필드를 공유하는 데 사용됩니다. 그것들은 자바8의 인터페이스와 유사합니다. 클래스와 객체는 트레잇을 확장 할 수 있지만 트레잇을 인스턴스화 할 수 없으므로 매개 변수가 없습니다.

트레잇 정의

가장 단순한 트레잇 정의는 예약어 trait과 식별자만 있는 것입니다:

trait HairColor

트레잇은 제네릭 타입과 추상 메서드로 특히 유용합니다.

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}

trait Iterator[A]를 확장하려면 A 타입 지정과 hasNext, next 메서드 구현이 필요합니다.

트레잇 사용하기

extends 예약어를 사용하여 트레잇을 확장하십시오. 그런 다음 override 예약어를 사용하여 트레잇의 추상 멤버를 구현하십시오:

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}

class IntIterator(to: Int) extends Iterator[Int] {
  private var current = 0
  override def hasNext: Boolean = current < to
  override def next(): Int = {
    if (hasNext) {
      val t = current
      current += 1
      t
    } else 0
  }
}


val iterator = new IntIterator(10)
iterator.next()  // returns 0
iterator.next()  // returns 1

IntIterator 클래스는 상한선으로 매개변수 to를 취합니다. extends Iterator[Int]는 트레잇 Iterator[A]를 확장했으며 next 메서드는 Int 값을 반환해야 한다는 의미입니다.

서브타이핑

특정 트레잇이 필요한 곳에 그 트레잇의 서브타입을 대신 사용할 수 있습니다.

import scala.collection.mutable.ArrayBuffer

trait Pet {
  val name: String
}

class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet

val dog = new Dog("Harry")
val cat = new Cat("Sally")

val animals = ArrayBuffer.empty[Pet]
animals.append(dog)
animals.append(cat)
animals.foreach(pet => println(pet.name))  // Prints Harry Sally

trait Pet에는 Cat과 Dog의 생성자에서 구현된 추상 필드 name이 있습니다. 마지막 줄에서 pet.name을 호출하고 있는데, 이것은 트레잇 Pet의 서브타입에서 구현되어야 합니다.

Contributors to this page: