kotlinlang.org/docs/delegation.html#overriding-a-member-of-an-interface-implemented-by-delegation
Delegation pattern ์ ์์์ ๊ตฌํํ๋๋ฐ์ ๋์ฒดํ๊ธฐ ์ข๊ณ , Kotlin์ ๋ณด์ผ๋ฌ์ฝ๋ ์์ด ์ฌ์ฉํ๋๋ก ์ง์ํ๋ค.
Derived ํด๋์ค๋ ์ง์ ํ ๊ฐ์ฒด(์ฌ๊ธฐ์๋ BaseImpl)๋ก ๋ชจ๋ public ๋ฉค๋ฒ๋ค์ ์์ํด์ Base ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main() {
val b = BaseImpl(10)
Derived(b).print()
}
๊ฒฐ๊ณผ
10
Derived์ ์์ํ์ ๋ชฉ๋ก(supertype list)์์ by ์ ์ b๊ฐ Derived ๊ฐ์ฒด์ ๋ด๋ถ์ ์ผ๋ก ์ ์ฅ๋ ๊ฒ์ด๊ณ ์ปดํ์ผ๋ฌ๋ b๋ก ์ ๋ฌ๋๋ Base์ ๋ชจ๋ ๋ฉ์๋๋ค์ ์์ฑํ ๊ฒ์ ๋ํ๋ธ๋ค.
delegation(์์)์ ์ํด ๊ตฌํ๋ ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ๋ฅผ overriding(์ฌ์ ์)ํ๊ธฐ
override๋ ์์๋๋ก ๋์ํ๋ค. ์ปดํ์ผ๋ฌ๋ delegate ๊ฐ์ฒด(์์ ๊ฐ์ฒด, ์์์์๋ BaseImpl) ๋์ ์ override ๊ตฌํ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
Derived์ override fun printMessage() { print("abe") } ๋ฅผ ์ถ๊ฐํ๋ฉด, ํ๋ก๊ทธ๋จ์ printMessage๊ฐ ํธ์ถ๋ ๋ 10 ๋์ ์ abc๋ฅผ printํ ๊ฒ์ด๋ค.
interface Base {
fun printMessage()
fun printMessageLine()
}
class BaseImpl(val x: Int) : Base {
override fun printMessage() { print(x) }
override fun printMessageLine() { println(x) }
}
class Derived(b: Base) : Base by b {
override fun printMessage() { print("abc") }
}
fun main() {
val b = BaseImpl(10)
Derived(b).printMessage()
Derived(b).printMessageLine()
}
๊ฒฐ๊ณผ
abc10
๊ทธ๋ ์ง๋ง ์ด ๋ฐฉ์์ผ๋ก ์ฌ์ ์๋(overriden) ๋ฉค๋ฒ๋ค์ ์์ ๊ฐ์ฒด(์์ ์์๋ BaseImpl)๊ฐ ์์ ๊ฐ์ฒด์์ ์ฌ์ ์๋ ๊ฐ์ผ๋ก ํธ์ถ๋์ง ์๊ณ , ์ธํฐํ์ด์ค ๋ฉค๋ฒ๋ค์ ๊ตฌํ ๊ฐ์ผ๋ก ์ ๊ทผํ๊ฒ ๋๋ค.
interface Base {
val message: String
fun print()
}
class BaseImpl(val x: Int) : Base {
override val message = "BaseImpl: x = $x"
override fun print() { println(message) }
}
class Derived(b: Base) : Base by b {
// This property is not accessed from b's implementation of `print`
// ์ด ํ๋กํํฐ๋ b์์ ๊ตฌํ๋ 'print'์์๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๋ค.
override val message = "Message of Derived"
}
fun main() {
val b = BaseImpl(10)
val derived = Derived(b)
derived.print()
println(derived.message)
}
๊ฒฐ๊ณผ
BaseImpl: x = 10
Message of Derived
Delegation์ ์์์ ๋์์ฉ
์์ํ ์ ์๋ ํด๋์ค์ ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] Equality ==, === (0) | 2021.03.08 |
---|---|
[Design Pattern] Delegation Pattern (0) | 2021.03.05 |
[Programming] Backpressure (0) | 2021.03.02 |
[Kotlin Coroutines] Channels (0) | 2021.03.02 |
[Android] java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView() (0) | 2021.03.02 |