상속보다 구성이 필요한 이유는 무엇입니까?
상속으로 시작
상속은 하나의 자식 클래스(하위 클래스)가 부모 클래스(슈퍼 클래스)로부터 모든 것을 물려받는 OOP의 개념입니다. 우리가 모든 것을 말할 때 그것이 의미하는 것은 해당 슈퍼 클래스의 속성과 기능입니다. 가장 좋은 것은 좋은 예를 제시하는 것입니다.
open class Animal {
fun eat() {
println("Njam njam")
}
}
class Dog: Animal() {
fun bark() {
println("Woof!")
}
fun run() {
println("Running..")
}
}
class Cat: Animal() {
fun meow() {
println("Meow!")
}
fun jump() {
println("Jumping..")
}
}
fun main() {
val goofy = Dog()
println("Goofy wants to eat ${goofy.eat()}")
val dizzie = Cat()
println("Dizzie wants to eat ${dizzie.eat()}")
}
Dog 및 Cat 하위 클래스의 상위 클래스로 Animal 클래스가 있습니다. 그리고 이것은 훌륭합니다. 우리는 Animal 클래스에서 eat() 메서드를 상속했습니다.
이제 프로젝트의 요구 사항이 변경되어 집 주변을 청소해야 하는 로봇 개와 음악을 연주하는 다른 로봇을 원하는 사람이 있습니다!
아 그렇군요... 자, 상속을 이용해서 위와 같은 것을 정의해 봅시다.
open class Robot {
fun stop() {
println("Stopping")
}
fun move() {
println("Moving")
}
}
class DogRobot : Robot() {
fun bark() {
println("Woof!")
}
fun clean() {
println("Cleaning around the house")
}
}
class MusicRobot: Robot() {
fun playMusic() {
println("LalaLalLa")
}
}
fun main() {
val goofyRobot = DogRobot()
println("Robot is ${goofyRobot.clean()}")
println("Robot is ${goofyRobot.move()}")
val musicRobot = MusicRobot()
println("Robot playing ${musicRobot.playMusic()}")
println("Stopping robot... ${musicRobot.stop()}")
}
우리는 지금 우리의 디자인을 가지고 있습니다. 모든 것이 멋져 보이고 갑자기, 어때? 요구 사항이 다시 변경되었습니다.
클라이언트는 짖고, 게임하고, 음악을 듣고, 요리하고, 집 주변을 청소할 수 있는 로봇을 요구합니다. 🙈
구조 구성.
컴포지션은 "외부에서"개체를 구성하고 구성하는 대신 다른 클래스에서 아무것도 상속하지 않는 개념입니다. 예를 보자:
class SuperRobot(
private val dogRobot: DogRobot,
private val musicalRobot: MusicRobot
) {
fun playMusic() {
println("Super robot will play some old school music: ${musicalRobot.playMusic()}")
}
fun bark() {
println("Barking around the house ${dogRobot.bark()}")
}
fun clean() {
println("Cleaning the house... ${dogRobot.clean()}")
}
}
fun main() {
val superRobot = SuperRobot(
dogRobot = DogRobot(),
musicalRobot = MusicRobot()
)
println("Playing music: ${superRobot.playMusic()}")
println("Barking: ${superRobot.bark()}")
println("Cleaning: ${superRobot.clean()}")
}
Kotlin은 다중 상속을 지원하지 않기 때문에 상속 개념으로 Kotlin에서 이를 달성하는 것은 불가능합니다.
상속의 단점은 다음과 같습니다.
상속보다 컴포지션을 사용할 때의 장점:
우리가 건설에 필요한 것.
요약
OOP의 일반적인 규칙은 상속보다 구성을 사용하는 것입니다. 꼭 필요한 경우와 하위 클래스가 존중해야 하는 엄격한 계약이 필요한 경우에만 상속을 사용하십시오. 다른 경우에는 구성을 위해 노력하십시오.
기억하기 쉬운 것은 다음과 같습니다.
행복한 코딩 :)
Reference
이 문제에 관하여(상속보다 구성이 필요한 이유는 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/boryans/why-composition-over-inheritance-2ne2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)