2011-12-05 13 views
0

간단한 질문은 여기에 있습니다. 책, 영화, CD 세트가 들어갈 수업을 정의해야합니다. 내가 템플릿 클래스는, (올바른 용어입니다?)있는 내가 다른 정의템플릿 클래스의 인스턴스에서 상속

class Movies_set : public Set<Movie> 
{ 
    /* ... */ 
} 

Set 클래스의 특정 인스턴스에서 파생 된 모든 일반적인 방법, 그리고 정의 된 클래스와 Set<T>을 말할 정의 메서드 (배우를 검색하는 함수). 좋은 프로그래밍 기술입니까 아니면 더 편리한 방법입니까?

+0

'Movies_set'과'Set '의 기능상의 차이점은 무엇입니까? –

+0

예를 들어, Movies_set에는 액터를 검색하는 메소드가있을 수 있습니다. 일반적으로 제목에서 검색하는 메소드로 설정합니다 (모든 클래스 Movie, Book, Album에는'search_in_title' 메소드가 있습니다) – Pincopallino

+0

떨어져서. 'Set '에'Movie '에 대한 특수한 동작이 없으면, 중복 된 이름의'Movies_set'도 없어야합니다. 두 가지 유형이 동등하지 않을 수도 있습니다. –

답변

3

실제 세트가 무엇인가에 따라 다릅니다. 나는 Set이 std :: set과 비슷한 것으로 의심하고,이 경우 파생에 대한 조언을하고 구성을 위해 당신을 조종한다.

Set에서 파생 된 이유는 MovieSet에서 아무 것도하지 않는 set의 API를 노출하기 때문에 좋지 않은 아이디어입니다. MovieSet 객체에 대한 검색을 수행 할 메서드가 필요한 경우 MovieSet 객체에 해당 메서드를 구현합니다. 특히, 지적했듯이 MovieSet 인터페이스를 향상시킬 예정입니다.

이렇게하면 캡슐화와 같은 강력한 이점도 얻을 수 있습니다. 어떤 이유로 Set을 std :: map으로 변경하려고하면 기본 클래스의 인터페이스가 변경되고 MovieSet에 액세스하는 모든 코드가 영향을받습니다. Set을 개인 데이터 멤버로 저장 한 경우 MovieSet의 적절한 접근자를 이미 정의 했으므로이 문제가 발생하지 않습니다.

물론, 내 전제에 따르면 Set은 실제로 컨테이너 일뿐입니다.

+0

서브 클래 싱의 대안으로 컴포지션을 언급하기 위해 +1 – kol

+0

나는 당신이 말하는 것을 이해합니다. Movie_set, Books_set, Album_set 클래스에는'Add','Remove','search_in_title' 같은 메소드가 많이 있기 때문에이 메소드를 사용 했으므로 동일한 템플릿 클래스에서 구현하는 것이 더 빠를 것이라고 생각했습니다. – Pincopallino

+0

그런 다음 비슷한 객체 유형을 검색하는 방법을 알고있는 Movie_set, Book_set 및 Album_set에 대한 공통 기본 클래스가 있다고 가정 해 봅시다. 또한 Movie, Book 및 Album의 기본 클래스 인 Media라는 클래스가 필요하다고 판단되는 경우이 클래스가 필요합니다. – fronsacqc

0

이 작업을 수행하는 데는 아무런 문제가 없으며 매우 일반적인 숙어입니다. 즉, 으로 충분할 수 있습니다. Movies_set 영화에 특정 기능이 관련 소개하면 상속이 길을 가야하는 것입니다,

typedef Set<Movie> Movies_Set; 

분명히 : 당신의 Movies_set가 새로운 특정 기능을 추가하지 않는 경우, 그것은 아마 낫다.

0

이것은 아주 좋습니다.

+1

저는 이것이베이스가 제네릭으로 전달되지 않는다고 생각합니다. 제 3 타입을베이스에 전달하고 있습니다. 그 조합을 새로운 자식 유형으로 앨리어싱합니다. – 111111

+0

@ 111111 : 수정하십시오. 나는 그것을 간과했다. 게시물을 편집했습니다. – Nawaz

0
:

사실, 그것은 기본 클래스 템플릿 형식 인수로 파생 클래스 자체를 사용하는 것을 제외하고, 거의 비슷한 일을 잘 알려진 패턴이

Movie_set이 Set의 구현을 추가하지 않으면 Set에서 파생되는 시간이 낭비입니다.

당신은 typedefing하는 것이 좋습니다.

typedef Set<Movie> movie_set; 

그런 식으로. 그러나 Set를 새로운 멤버 함수 및 데이터 멤버와 함께 추가로 전문화하는 경우에는 컨테이너 ins't에서 파생되었지만 (대개 사용자가 소유하고 있음에도 불구하고) 괜찮습니다. 또한 필요한 함수가 가상 (소멸자)이기 때문에 오랫동안 괜찮습니다.