[Kotlin] 3-10. 위임

위임

클래스 위임

위임 패턴은 구현 상속보다 좋은 대안 / 코틀린은 중복코드 없는 위임 패턴을 지원
아래의 코드에서 Derived 클래스는 Base 인터페이스를 상속할 수 있으며, 모든 public 메서드를 지정한 객체로 위임

interface Base {
  fun print()
}

class BaseImpl(val x: Int) : Base {
  override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
  val b = BaseImpl(10)
  Derived(b).print()  // 10 출력
}

Derived의 상위타입 목록에 있는 by절은 Derived의 객체 내부에 b를 저장한다는 것을 의미
컴파일러는 Base의 모든 메서드를 b로 전달하도록 Derived를 생성
override는 그대로 동작. override가 존재하면 컴파일러는 객체의 메서드 대신 override구현을 사용
Derived에 override fun print() { print(“abc”) } 를 추가하면 프로그램은 “10” 대신 “abc”를 출력한다.