2010-03-11 7 views

답변

0

다중 상속을 지원하지 않는 언어에서는 다른 클래스 (유형)에서 파생 될 기회를 '구워'지 않습니다.

또한 문제 도메인을보다 적절하게 모델링 할 수 있습니다.

1
+0

흥미로운 기사이지만 기사의 제목이 암시 하듯이 상속은 사용해서는 안된다고 말하는 것이 아니라 상속이 각 문제마다 해결책이라고 실제로 말합니다. – OregonGhost

+0

예 ... 실제 상속을 부적절하게 사용하는 것은 악의적 인 행위입니다. 실제로는 상속이 아닙니다 ... – ultrajohn

+0

나는 기사의 사고 방식을 좋아합니다. 하지만 몇 가지 이유로이 예제의 구현이 마음에 들지 않습니다. 첫째, 전략 패턴의 실제 구현이 아닙니다. 전략 패턴은 집계 된 객체 메소드에 공통 메소드를 프록시해야합니다. Strategy Pattern을 올바른 방법으로 구현하는 방법에 대한 훨씬 더 좋은 예가 있습니다 : http://www.cumps.be/design-patterns-strategy-pattern/ 둘째, 나에게는 덜 중요하지만, 집계 된 Demeter의 법칙을 위반 한'dj.darkPowers.crushTownspeople()'개체 : http://en.wikipedia.org/wiki/Law_of_Demeter. –

0

새 클래스는 완전히 ... (가) 특정 '기본 클래스'의 '상속'계층 구조 아래에 넣어 수 있습니다 무언가로

상당한 혜택 자격이되지 않기 때문에 :

다른 확장의 옵션을 클래스는 '항상'사용할 수는

당신이 바로 그 상황에 좋은 도구가 기본 클래스

+0

그러나 imho 구성에는 더 많은 코드가 필요합니다. 상속의 경우 변경하려는 항목을 덮어 써야 만합니다 (보통 1-2 가지 방법). 전체 인터페이스 또는 추상화를 제공하여 컴포지션을 "외관"으로 만들거나 위반하는 객체에 대한 액세스를 허용해야합니다 캡슐화. OTOH 저는 각각 특수한 유스 케이스를 가지고 있기 때문에 관련 패턴으로 구성과 상속을 실제로 보지 못합니다. – dbemerlin

+1

예, 정말로 다릅니다 ... 실제로 문제는 적절하지 않을 때 상속을 사용하는 것입니다 ... 등등 ... 이런 종류의 일은 어떤 개인이 보았을 때 상속이 나쁜 단서임을 알게되었을 때입니다. 사실 그 물건이 실제로 나쁘다는 결론에 이르기까지 실제로는, 그것이 가정하지 않을 때 상속을 사용하는 것입니다. – ultrajohn

0

상속의 구현 및 정의하는 것입니다 묶여되지 않습니다,하지만 종종 남용이다.

컴포지션을 상속 받아 사용하면 구현을 즉시 수행 할 수 있습니다. 예를 들어, 동작을 제공하는 인터페이스를 제공하여 클래스를 구성 할 수 있습니다. 그 클래스가 다른 상황에 대해 2 가지 구현을 필요로하면 그 자유가 있습니다. 그러나 상속을 사용했다면 여전히 수퍼 클래스의 동작을 유지할 수 있으며 많은 부분에서 오버라이드해야합니다. 기본적으로 컴포지션은 객체를 만드는 데 훨씬 유연한 모델입니다.

5

이 문서는 당신에게 완벽한 대답을해야합니다

나는 여전히도 십년 후에 사실 생각 : Design Principles from Design Patterns: Composition versus inheritance

가 나는 바로 여기 에릭 감마 (Erich Gamma)에서 답을 인용. 상속은 행동을 바꾸는 멋진 방법입니다. 그러나 서브 클래스가 오버라이드 (override) 한 메소드가 호출되는 컨텍스트에 대한 가정을 쉽게 할 수 있기 때문에 깨지기 쉽다는 것을 알고 있습니다. 기본 클래스와 하위 클래스 사이에는 긴밀한 결합이 있습니다. 왜냐하면 암시 적 컨텍스트로 인해 플러그인하는 하위 클래스 코드가 호출되기 때문입니다. 컴포지션에는 더 좋은 속성이 있습니다. 커플 링은 당신이 더 큰 것으로 연결하는 작은 것들을 가지고 만 줄어들고, 더 큰 물체는 더 작은 물체를 다시 호출합니다. 메소드가 대체 될 수 있음을 정의하는 API 관점에서 메소드를 호출 할 수 있음을 정의하는 것보다 더 강력한 확약입니다.

재정의하는 메소드가 호출 될 때 하위 클래스에서 상위 클래스의 내부 상태에 대한 가정을 할 수 있습니다. 몇 가지 동작을 연결하면 간단 해집니다. 그래서 당신이 작곡을 선호해야합니다. 일반적인 오해는 구성이 상속을 전혀 사용하지 않는다는 것입니다. 컴포지션은 상속을 사용하지만 일반적으로 작은 인터페이스 만 구현하면 큰 클래스에서 상속되지 않습니다. Java Listener 관용구는 작곡을위한 좋은 예입니다. 리스너를 사용하여 리스너 인터페이스를 구현하거나 어댑터라는 것을 상속합니다. 리스너 객체를 만들고 Button 위젯으로 등록합니다 (예 :). 이벤트에 반응하려면 Button을 서브 클래스 할 필요가 없습니다.

0

여러 디자인 패턴은 상속 된 구현이 사용되는 인터페이스의 구성을 사용합니다. 그래서 구성은 상속을 배제하지 않습니다.
그러나 모든 상속을 사용하면 다중 상속, 큰 클래스 계층 구조 및 많은 예외가 발생하는 경향이 있습니다.