Delegation(위임) 패턴은 상속의 대안으로 적합하다고 증명되었고, Kotlin 은 별다른 코드 필요없이 이를 지원한다.
아래 예에서 DerivedClass는 특정 객체를 위임 함으로서 BaseInterface를 구현할 수 있다. by 절을 이용해서 b가 DerivedClass 내부에 저장 되고 컴파일러는 BaseInterface의 모든 메소드를 b를 바라보는 방법으로 생성하게 된다.
interface BaseInterface {
fun print()
}
class BaseImpl(val x: Int) : BaseInterface {
override fun print() { print(x) }
}
class DerivedClass(b: BaseInterface) : BaseInterface by b
fun main() {
val b = BaseImpl(10)
DerivedClass(b).print()
}
Overriding
DerivedClass 가 마치 BaseInterface를 구현하고 있다고 생각하고 override 키워드를 이용해서 overriding 할 수 있다.
이 경우 재정의한 멤버는 위임한 객체(b: BaseInterface)의 멤버에는 접근 할 수 없고 DerivedClass 의 멤버에만 접근 가능하다. (예제를 보자)
interface BaseInterface {
val message: String
fun printMessage()
fun printMessageLine()
fun print()
}
class BaseImpl(val x: Int) : BaseInterface {
override fun printMessage() { print(x) }
override fun printMessageLine() { println(x) }
override val message: String = "BaseImpl: x = $x"
override fun print() {
println(message)
}
}
class DerivedClass(b: BaseInterface) : BaseInterface by b {
override fun printMessage() {
print("abc")
}
fun printMessage2() {
printMessage()
}
override val message = "Message of DerivedClass"
}
fun main() {
val b = BaseImpl(10)
DerivedClass(b).printMessage() // abc
println()
DerivedClass(b).printMessageLine() // 10
val derived = DerivedClass(b)
derived.print() // BaseImpl: x = 10 - message 를 재 정의 했지만 b의 print 함수를 사용하므로 b의 message가 출력된다.
println(derived.message) // Message of DerivedClass
}
반응형
'Kotlin' 카테고리의 다른 글
Kotlin - Delegated properties (0) | 2024.03.28 |
---|---|
Kotlin - Object 표현과 정의 (0) | 2024.03.23 |
Kotlin - 인라인 값 클래스 (inline value classes) (0) | 2024.03.05 |
Kotlin - Enum 클래스 (1) | 2024.02.17 |
Kotlin - 중첩 클래스, 내부 클래스 (Nested and inner classes) (0) | 2024.02.13 |