상위 클래스와 하위 클래스의 결합도가 높아져 상위 클래스의 변화가 하위 클래스에 주는 영향을 예측하기 어렵다.
불필요한 상위 클래스의 메서드까지 구현해야 한다.
하위 클래스로 내려갈수록 기능이 더해져 파악하기 어렵다.
final클래스의 경우 상속이 불가능하다.
상속의 대안 위임
특정 처리를 다른 객체에게 넘기는 것을 의미한다.
다른 객체는 클래스 내부(포함)에 가지고 있는다.
코틀린 에서는 by키워드로 클래스 위임을 만들 수 있다.
interface Attackable {
fun attack()
}
class Knife: Attackable {
override fun attack() {
println("attack with knife")
}
}
class Gun: Attackable {
override fun attack() {
println("attack with gun")
}
}
class Attacker(private val impl: Attackable): Attackable by impl
fun main() {
val attackerWithKnife = Attacker(Knife())
attackerWithKnife.attack() // attack with knife
val attackerWithFun = Attacker(Gun())
attackerWithFun.attack() // attack with gun
}