답변
다중 상속을 지원하지 않는 언어에서는 다른 클래스 (유형)에서 파생 될 기회를 '구워'지 않습니다.
또한 문제 도메인을보다 적절하게 모델링 할 수 있습니다.
새 클래스는 완전히 ... (가) 특정 '기본 클래스'의 '상속'계층 구조 아래에 넣어 수 있습니다 무언가로
상당한 혜택 자격이되지 않기 때문에 :
다른 확장의 옵션을 클래스는 '항상'사용할 수는
당신이 바로 그 상황에 좋은 도구가 기본 클래스
그러나 imho 구성에는 더 많은 코드가 필요합니다. 상속의 경우 변경하려는 항목을 덮어 써야 만합니다 (보통 1-2 가지 방법). 전체 인터페이스 또는 추상화를 제공하여 컴포지션을 "외관"으로 만들거나 위반하는 객체에 대한 액세스를 허용해야합니다 캡슐화. OTOH 저는 각각 특수한 유스 케이스를 가지고 있기 때문에 관련 패턴으로 구성과 상속을 실제로 보지 못합니다. – dbemerlin
예, 정말로 다릅니다 ... 실제로 문제는 적절하지 않을 때 상속을 사용하는 것입니다 ... 등등 ... 이런 종류의 일은 어떤 개인이 보았을 때 상속이 나쁜 단서임을 알게되었을 때입니다. 사실 그 물건이 실제로 나쁘다는 결론에 이르기까지 실제로는, 그것이 가정하지 않을 때 상속을 사용하는 것입니다. – ultrajohn
상속의 구현 및 정의하는 것입니다 묶여되지 않습니다,하지만 종종 남용이다.
컴포지션을 상속 받아 사용하면 구현을 즉시 수행 할 수 있습니다. 예를 들어, 동작을 제공하는 인터페이스를 제공하여 클래스를 구성 할 수 있습니다. 그 클래스가 다른 상황에 대해 2 가지 구현을 필요로하면 그 자유가 있습니다. 그러나 상속을 사용했다면 여전히 수퍼 클래스의 동작을 유지할 수 있으며 많은 부분에서 오버라이드해야합니다. 기본적으로 컴포지션은 객체를 만드는 데 훨씬 유연한 모델입니다.
이 문서는 당신에게 완벽한 대답을해야합니다
나는 여전히도 십년 후에 사실 생각 : Design Principles from Design Patterns: Composition versus inheritance
가 나는 바로 여기 에릭 감마 (Erich Gamma)에서 답을 인용. 상속은 행동을 바꾸는 멋진 방법입니다. 그러나 서브 클래스가 오버라이드 (override) 한 메소드가 호출되는 컨텍스트에 대한 가정을 쉽게 할 수 있기 때문에 깨지기 쉽다는 것을 알고 있습니다. 기본 클래스와 하위 클래스 사이에는 긴밀한 결합이 있습니다. 왜냐하면 암시 적 컨텍스트로 인해 플러그인하는 하위 클래스 코드가 호출되기 때문입니다. 컴포지션에는 더 좋은 속성이 있습니다. 커플 링은 당신이 더 큰 것으로 연결하는 작은 것들을 가지고 만 줄어들고, 더 큰 물체는 더 작은 물체를 다시 호출합니다. 메소드가 대체 될 수 있음을 정의하는 API 관점에서 메소드를 호출 할 수 있음을 정의하는 것보다 더 강력한 확약입니다.
재정의하는 메소드가 호출 될 때 하위 클래스에서 상위 클래스의 내부 상태에 대한 가정을 할 수 있습니다. 몇 가지 동작을 연결하면 간단 해집니다. 그래서 당신이 작곡을 선호해야합니다. 일반적인 오해는 구성이 상속을 전혀 사용하지 않는다는 것입니다. 컴포지션은 상속을 사용하지만 일반적으로 작은 인터페이스 만 구현하면 큰 클래스에서 상속되지 않습니다. Java Listener 관용구는 작곡을위한 좋은 예입니다. 리스너를 사용하여 리스너 인터페이스를 구현하거나 어댑터라는 것을 상속합니다. 리스너 객체를 만들고 Button 위젯으로 등록합니다 (예 :). 이벤트에 반응하려면 Button을 서브 클래스 할 필요가 없습니다.
여러 디자인 패턴은 상속 된 구현이 사용되는 인터페이스의 구성을 사용합니다. 그래서 구성은 상속을 배제하지 않습니다.
그러나 모든 상속을 사용하면 다중 상속, 큰 클래스 계층 구조 및 많은 예외가 발생하는 경향이 있습니다.
- 1. C# 상속 디자인 패턴 질문
- 2. "저널링"또는 "트랜잭션"디자인 패턴?
- 3. 디자인 패턴 선택
- 4. 디자인 패턴 - 전략 패턴
- 5. 유효성 검사 디자인 패턴
- 6. 디자인 패턴
- 7. 디자인 레이아웃/패턴
- 8. 직렬화를위한 클래스 디자인 - 아이디어 또는 패턴?
- 9. 액티브 레코드 - 디자인 패턴 또는 모듈이란 무엇입니까?
- 10. MVVM 디자인 패턴
- 11. 제품 디자인 패턴
- 12. PHP 디자인 패턴
- 13. 회계 소프트웨어 디자인 패턴
- 14. 여러 서비스를위한 디자인 패턴
- 15. C++ 상속 패턴 + CRTP
- 16. 트랜잭션 디자인 패턴
- 17. Zend_Form와 OOP 디자인 패턴
- 18. 디자인 패턴 - 인터페이스 분리
- 19. Compact Framework의 디자인 패턴
- 20. asp.net의 제공자 디자인 패턴
- 21. 게임 결정 디자인 패턴
- 22. 옵저버 디자인 패턴 질문
- 23. 디자인 패턴 질문
- 24. Delphi 2009의 디자인 패턴
- 25. 반복 속성 디자인 패턴
- 26. 디자인 대규모의 술어 라이브러리 구성을위한 패턴 또는 좋은 아이디어
- 27. 직렬 통신 디자인 패턴
- 28. 디자인 패턴 실제 예제
- 29. 추상 디자인/패턴 질문
- 30. 외관 디자인 패턴 - 구현
흥미로운 기사이지만 기사의 제목이 암시 하듯이 상속은 사용해서는 안된다고 말하는 것이 아니라 상속이 각 문제마다 해결책이라고 실제로 말합니다. – OregonGhost
예 ... 실제 상속을 부적절하게 사용하는 것은 악의적 인 행위입니다. 실제로는 상속이 아닙니다 ... – ultrajohn
나는 기사의 사고 방식을 좋아합니다. 하지만 몇 가지 이유로이 예제의 구현이 마음에 들지 않습니다. 첫째, 전략 패턴의 실제 구현이 아닙니다. 전략 패턴은 집계 된 객체 메소드에 공통 메소드를 프록시해야합니다. Strategy Pattern을 올바른 방법으로 구현하는 방법에 대한 훨씬 더 좋은 예가 있습니다 : http://www.cumps.be/design-patterns-strategy-pattern/ 둘째, 나에게는 덜 중요하지만, 집계 된 Demeter의 법칙을 위반 한'dj.darkPowers.crushTownspeople()'개체 : http://en.wikipedia.org/wiki/Law_of_Demeter. –