2010-08-09 5 views
42

"상속보다 유리한 구성"에 대해 많이 듣습니다 (이 사이트에서 읽음).객체 지향 디자인과 관련된 구성은 무엇입니까?

하지만 Compositon은 무엇입니까? 저는 인간의 관점에서 상속을 이해합니다 : 포유 동물 : 동물,하지만 어디서나 Compostion의 정의를 볼 수는 없습니다. 누군가 나를 채울 수 있습니까?

답변

49

작문은 간단한 유형을 결합하여 더 복잡한 유형을 만드는 것을 말합니다. 당신의 예에서, 구성은 수 :

Animal: 
    Skin animalSkin 
    Organs animalOrgans 

Mammal: 
    private Animal _animalRef 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person: 
    private Mammal _mammalRef 
    string firstName 
    string lastName 

이 방법의 장점은 것입니다 :

Animal: 
    Skin animalSkin 
    Organs animalOrgans 


Mammal::Animal: 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person::Mammal: 
    string firstName 
    string lastName 

당신이 같을 것이다 완전히 구성을 이동 (모든 상속 제거) 원한다면 MammalPerson 유형은 이전 상위의 인터페이스를 준수 할 필요가 없습니다. 이 일 수 있습니다. 수퍼 클래스 변경이 서브 클래스에 심각한 영향을 미칠 수 있기 때문에 좋은 일이 될 수 있습니다. 그들은 여전히 ​​이러한 클래스의 private 인스턴스를 통해 이러한 클래스의 속성 및 동작에 액세스 할 수 있으며 이전의 수퍼 클래스 동작을 공개하려는 경우 공용 메서드로 간단히 래핑 할 수 있습니다. 클래스에 동작을 제공하는 세 가지 방법이 있습니다 http://www.artima.com/designtechniques/compoinh.html

+4

이렇게 말 할 수 있습니다 : "작곡은 Class A에서 Class B를 서브 클래 싱하는 대신 Class B 안에 객체를 생성 할 때입니다. ? – thesummersign

+0

오. 좋아, 나중에 w69rdy가 대답했다. 네, 그렇게 말할 수 있습니다. – thesummersign

31

구성은 단순히 전체를 구성하는 부분입니다. 자동차에는 바퀴, 엔진 및 좌석이 있습니다. 상속은 "관계"입니다. 작문은 "관계가있다". 다른 클래스 내에서 클래스의 인스턴스가 어디

+2

그리고 집계는 ... 관계입니다. –

+1

집계는 단순한 구성 일 수도 있고, 비슷한 물건 (예 : 자동차의 차륜)의 모음 일 경우 컬렉션으로 처리 될 수도 있습니다.자동차는 4 개의 개별 바퀴를 가질 수 있으며 고유하게 식별되거나 바퀴 집합을 가질 수 있습니다. 사용법에 따라 다릅니다. 컬렉션 클래스를 사용하는 경우 컬렉션 자체가 집합입니다. –

2

구성의 예는 대신에서

This 페이지를 상속이며, 사람들의 몇 가지 예에 "상속 이상의 찬성 구성"라고 이유를 설명하는 좋은 기사를 가지고 왜.

+1

* 다른 클래스 [C2]의 클래스 [C2] 인스턴스가 아니라 다른 클래스의 ** 인스턴스 ** 내의 클래스의 인스턴스 **입니다. 전자는 C1을 정의 할 때 C2를 인스턴스화 한 것처럼 오해 할 수 있습니다. 공통적이지 않아야합니다. –

14

:

은 여기 좋은 예제와 함께 좋은 링크를 발견했다. 클래스에 해당 동작을 작성할 수 있습니다. 원하는 동작을 가진 클래스에서 상속받을 수 있습니다. 또는 원하는 동작이있는 클래스를 필드 또는 멤버 변수로 클래스에 통합 할 수 있습니다. 마지막 두 개는 코드 재사용의 형태를 나타내며, 마지막 하나는 일반적으로 선호됩니다. 실제로 클래스에 원하는 동작을 제공하지는 않지만 - 여전히 필드에서 메서드를 호출해야하지만 클래스 디자인에 대한 제약이 적어지고 테스트가 쉽고 코드를 쉽게 디버깅 할 수 있습니다. 상속은 그 자리를 차지하고 있지만, 구성이 선호되어야합니다.

+1

+1 : 작곡은 킹이다. –

11
class Engine 
{ 

} 

class Automobile 
{ 

} 


class Car extends Automobile // car "is a" automobile //inheritance here 
{ 
Engine engine; // car "has a" engine //composition here 

} 

구성 - 객체의 기능이 다른 클래스의 집합체로 구성되어 있습니다. 실제로 이것은 작업이 연기되는 다른 클래스에 대한 포인터를 보유한다는 것을 의미합니다.

상속 - 개체의 기능은 자체 기능과 부모 클래스의 기능으로 구성됩니다.

왜 컴포지션이 상속보다 선호되는지에 대해서는 Circle-ellipse problem을 살펴보십시오.