2011-12-05 18 views
0

ここに簡単な質問があります。私は本、映画、CDのセットを含むクラスを定義する必要があります。私は、テンプレートクラスは、(それが正しい用語です?)ここで私はいくつかの他の定義テンプレートクラスのインスタンスから継承

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

Setクラスの特定のインスタンスから派生するすべての一般的な方法、および、定義されたクラスとSet<T>を、言って定義されましたメソッド(例えば、アクターを検索する関数)。それは良いプログラミングテクニックですか、もっと便利な方法ですか?

+0

「Movies_set」と「Set 」の機能上の違いは何ですか? –

+0

たとえば、Movies_setにはアクタを検索するメソッドがありますが、一般的なSetはタイトルで検索するメソッド(Movie、Book、Albumのすべてのクラスは 'search_in_title'メソッドを持っています) – Pincopallino

+0

オフ。 'Set 'に 'Movie'の特殊な振る舞いがまだない場合は、' movie_set'という名前の重複名はどちらでもないはずです。私は2つのタイプが同じではないにしても同等であると思います。 –

答えて

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の共通の基底クラスがあることをお勧めします。Media_setは、これらの類似したオブジェクト型を検索する方法を知っています。 さらにMovie、Book、Albumの基本クラスであるMediaという名前のクラスが必要になると思われます。 – fronsacqc

0

これは絶対にこれを行うことで間違ったことではありません。それはかなり一般的なイディオムです。つまり、typedefで十分です。あなたのMovies_setは新しい特定の機能を追加していない場合、それはおそらくすると良いでしょう:Movies_setは、映画に関連する特定の機能が導入されている場合

明らか
typedef Set<Movie> Movies_Set; 

、継承は移動するための方法です。

0

これはまったく問題ありません。

+1

これは、彼がジェネリックにベースを渡していないと思う、彼はベースに3番目のタイプを渡している。その組み合わせを新しい子タイプとしてエイリアシングすることです。 – 111111

+0

@ 111111:正しい。私はそれを見落とした。投稿を編集しました。 – Nawaz

0

実際には、それが基底クラステンプレートに型引数として派生クラス自体を使用することを除いて、ほとんど同じようなことをして、よく知られたパターンが存在します

Movie_setがSetの実装に何も追加しない場合、それはセットから派生する時間の無駄です

あなたはそれを型定義する方が良いです。

typedef Set<Movie> movie_set; 

そうです。しかし、Setを新しいメンバー関数やデータメンバーでさらに専門化しているのであれば、コンテナは一般的ではありません(通常はあなたが所有しています)。しかし、必要な機能が仮想(デストラクタ)である限り、それは大丈夫です。

関連する問題