2013-08-23 3 views
1

복합 패턴의 기본 클래스 인 Item 클래스가 있다고 가정합니다.복합 패턴의 특정 복합 데이터에 액세스

나는 영화와 음악이 서로 다른 데이터를 포함하는 두 가지 특정 서브 클래스가 있습니다

  • 영화 : 감독, 제작자, 배우의 목록을 ...
  • 음악 : chanteur, 판매 기록의 수 ...

클라이언트 코드에서 (예를 들어) 영화 데이터에 액세스하려면 getProducer()가 Item 클래스의 메서드가 아니기 때문에 이에 상응하는 Item을 다운 캐스팅해야합니다.

나는 세 가지 방법 사이에 끼 었어 :

  1. 이 항목 인터페이스의 모든 서브 클래스의 방법을 넣어
  2. 다른 항목에서 데이터를 추출 할 클라이언트 코드
  3. 를 사용하여 객체에서 내리 뜬 항목 이 클라이언트 항목의 서브 클래스를 숨 깁니다 때문에 세 번째 명제는 재미있는 것 같다

(방문자 패턴의 종류를 사용),하지만 난 클라이언트 UPDAT 수 있도록하는 방법을 모른다 항목 (예 : 영화 제작자 변경).

응용 프로그램에서 지원하는 Item 서브 클래 싱 유형은 릴리스를 거쳐 증가 할 것이므로 이러한 유형 추가를 용이하게하기 위해이를 디자인하려고합니다.

어쩌면 나는 완전히 잘못된 방향으로 가고 있으며 다른 더 나은 해결책이있을 것입니다.

답변

0

옵션 1은 좋지 않은 아이디어입니다. getProducer()가 항목에 속하지 않기 때문입니다.

옵션 3은 구현하려는 게터 메소드 외에 설정 도구를 입증 한 경우에도 작동합니다.

옵션 2는 나에게 가장 합리적인 것으로 들립니다. 주조는 다형성 솔루션에서 일반적인 작업이며 적절한 경우에 적합합니다.

+0

당신은 옵션 3을 사용하여 데이터 객체를 사용하여 아이템을 업데이트하고 그것을 파싱 (Item 서브 클래스에서 적절한 setter를 호출) 할 수 있다고 말했습니까? 당신이 옳다고 생각하고 다운 캐스트를 사용하면 두통이 줄어들 것입니다! 그렇게 하기엔 너무 끔찍한 방법이 아니길 바랍니다. – zelus

0

IMO, MovieMusic 개체는 완전히 다르며 공통 기본 클래스에서 파생되지 않아야합니다. 당신은 아직도 그것을 수행하려는 경우 (있는 그대로 그냥 예제 코드.이 코드를 사용하지 마십시오)

abstract class Item 
{ 
    virtual object GetData(string sDataID); 
} 

이제 아래 그림과 같이 그러나,의 Item 클래스를 수정, 파생 클래스에서이를 대체 할 수 있습니다 다음과 같은 메소드.

class Movie: Item 
{ 
    private Producer m_Producer = new Producer(); 
    override object GetData(string sDataID) 
    { 
     object ret = null; 
     switch(sDataID) 
     { 
      case "Producer": 
       ret = m_Producer; 
       break; 
     }   
    } 

그리고 클라이언트 코드에서 다음과 같이 할 수 있습니다.

Item objItem = new Movie(); 
Producer objProducer = (Producer)objItem.GetData("Producer"); 

아이디어가 있습니다.

+0

비슷한 해결책에 대해 생각했지만 문제는 내가 C++로 내 응용 프로그램을 개발하고 있으며 GetData 메서드의 반환을 추상화하는 쉬운 방법을 알지 못한다는 것입니다. (어쩌면 템플릿을 사용하고 있지만 그럴 경우 좋은 생각인지는 모르겠다.)Thanks – zelus