구성은 클래스에서 상속하는 대신 이미이 기능을 구현하는 (아마도 내부) 클래스를 인스턴스화하여 클래스가 일부 기능을 제공하는 경우입니다.
예를 들어, 당신이 배를 모형화하는 클래스를 가지고 있고 배가 헬기 착륙장을 제공해야한다고 들었다면, 대신 헬기 착륙장에서 배를 파생시키는 것은 당연하지 않습니다. 당신의 함선은 헬기 이착륙장을 포함하고 있으며 어떤 Ship.getHelipad()
방법으로 노출시킨다 .
수십 년 전쯤에 사람들은 상속을 기능을 집계하는 빠르고 쉬운 방법으로 보았 기 때문에 당연히 절름발이 인 "헬리 파드에서 상속 된 선박"종류의 많은 예가있었습니다.
그러나 "상속에 대한 선호 구성"dictum은 이것이 규칙이 아니라 단지 제안 일뿐임을 분명히하기 위해 신중하게 표현되었습니다. dictum의 저자는 "당신 은 상속을 절대로 사용 하지 말고 작곡 만 사용 하라"는 말을 자제하기에 충분히주의를 기울였습니다 . 이것은 기본적으로 상속이 과도하게 사용되었다는 사실을 소프트웨어 엔지니어링 커뮤니티의 주목을 끌고있는 반면, 많은 경우 컴포지션은 상속보다 명확하고 우아하며 유지 보수 가능한 디자인을 생성합니다.
따라서 본질적으로 "상속에 대한 선호 구성"dictum은 "상속 또는 구성?"에 직면 할 때마다 제안합니다. 질문, 당신은 가장 적합한 전략이 무엇인지 열심히 생각해야하며, 대부분의 가능성은 가장 적합한 전략이 상속이 아니라 구성이 될 수 있다는 것입니다.
그러나 이것이 규칙이 아니기 때문에 상속이 더 자연스러운 경우가 많다는 것을 명심해야합니다. 상속을 사용해야 할 곳에 컴포지션을 사용하면 많은 악이 코드에 해당됩니다.
우주선 예제로 돌아가려면, 우주선이와 상호 작용하기위한 인터페이스를 제공해야하는 경우 FloatingMachine
추상 FloatingMachine
클래스 에서 파생하는 것이 더 자연 스럽습니다 Machine
.이 클래스 는 다른 추상 클래스 에서 파생 될 수 있습니다 .
다음은 작문과 상속 질문에 대한 답변의 경험 법칙입니다.
내 클래스가 노출해야하는 인터페이스와 "존재"관계가 있습니까? 그렇다면 상속을 사용하십시오. 그렇지 않은 경우 구성을 사용하십시오.
선박은 "플로팅 머신"이고 플로팅 머신은 "플로팅 머신"입니다. 따라서 상속은 완벽하게 좋습니다. 그러나 배는 물론 헬기 착륙장이 아닙니다. 따라서 헬기 착륙장의 기능을 더 잘 구성 할 수 있습니다.