2010-04-06 2 views
5

이 예에서 옵션 2의 장점/단점은 무엇입니까?List <>에 비헤이비어를 추가해야하는 경우 상속을 통해 composition을 사용하면 어떤 이점이 있습니까?

옵션 1 (상속) :

public class SalesList : List<Sales> 
{ 
    //methods that add extra behavior List<Sales> 
} 

옵션 2 (구성) : 옵션 2의

public class SalesList 
{ 
    private List<Sales> _list; 
    //methods that add extra behavior to List<Sales> 
} 
+0

가능한 복제본 : http://stackoverflow.com/questions/1598722/should-i-use-inheritance-or-composition – Lucero

답변

1

옵션 1
- 장점 - 상속 & 재사용
의 모든 장점 - 단점 - 코드는 지금은 목록에서 dervied하고있는 소비자에게 신호된다. 나중에 변경해야하는 경우 모든 관련 소비자가 영향을받습니다.

옵션 2
- 장점 - 판매 데이터의 저장에 대한 구현 세부 정보가 소비자로부터 추상화되었습니다. 따라서 구현이 변경되어야하는 경우 (예 : 사전), 클래스 소비자는 이러한 변경 사항으로부터 영향을받지 않습니다.
단점 - SalesList 클래스는 이제 내부 _list 개체를 가져 오거나 설정하기위한 추가 메서드를 노출해야합니다. 이것은 유지해야 할 추가 코드입니다. 또한 내부 구현이 변경되면 이전 동작을 계속 지원해야합니다. ...

마음에 떠오르는 몇 가지 생각.

HTH.

2

장점은 민첩성이다. 컴포지션을 사용하면 목록 인터페이스에서 노출 할 부분을 선택할 수 있습니다.

나중에 다른 클래스에서 확장하지 않기로 결정했다고 상상해보십시오. 이제는 라이브러리 사용자 중 일부가 List에서 제공하는 메소드를 사용하므로 add/addAll/contains/retainAll과 같은 모든 목록 메소드를 직접 구현해야합니다. 이는 간단한 판매리스트를 구현하는 많은 방법입니다.

기본적으로 조슈아 블로흐가 말한 "의심의 여지가있을 때 떠나라"는 말은 Bumper-Sticker API Design입니다. API의 모든 측면은 가능한 작아야하지만 더 작아서는 안됩니다. 나중에 언제든지 추가 할 수 있지만 제거 할 수는 없습니다.

2

컴포지션의 주된 단점은 동일한 인터페이스를 제공해야 할 경우 개인 목록의 모든 공용 메서드를 래핑 (복제)해야한다는 것입니다. 상속에서 이미 사용할 수 있지만 모두 사용할 수는 있습니다. 재정의 할 수 없도록 만든 클래스를 재정의하십시오 (C#에서는 메서드가 '가상'으로 표시되어야 함을 의미하고 Java에서는 '최종'으로 표시 할 수 없음).

C# 3 이상에서는 확장 메서드를 사용할 수 있습니다. 확장 메서드를 사용하면 계층 구조 트리를 엉망으로 만들지 않고 상속 된 모양을 유지할 수 있습니다.

+0

더 큰 단점은 '판매 목록'을 전달할 수 없다는 것입니다 'List '또는 일반적인'List '을 기대하는 방법. 모든'List' 메소드를 재 작성하는 것은 짜증나지만 거의 불가능합니다. 코드를 가지고 있지 않은 메소드가'List '을 기대한다면, 그 메소드를 사용하는 것은 어렵거나 불가능할 수 있습니다. 내부 목록에 대한 참조가 누출되면 문제를 해결하는 것처럼 보일 수 있지만 더 많은 것을 생성합니다. 'List'의 많은 메소드가 가상이 아니기 때문에 파생 클래스는 그 행동을 많이 바꿀 수 없습니다. 사람이 무엇을 하든지간에 사람이 붙어있을 수 있습니다. – supercat

0

컴포지션에서 런타임에 수퍼 클래스 구현을 동적으로 변경할 수 있습니다. 그러나 상속을 사용하면 런타임에 수퍼 클래스 구현을 변경할 수 없습니다.

컴포지션에서는 설정자에게 전달할 개체의 유형에 따라 달라지며 설정에 따라 동작합니다.그것은

2

상속은 부모가 *가되도록 클래스의 계층 구조를 형성 할 수있게 해준다 구현에 더 많은 유연성을 제공합니다 슈퍼 * 설정과 그 자식의입니다 수 있습니다 * 하위 * 세트, 일반화, 전문화 및 적용 할

관련 문제