2017-01-30 4 views
1

私はクラスをプライベート継承を通して拡張したいと思っています。C++プロジェクト設計 - プライベート継承と "a"関係

基底クラスは次のとおりです。Graph<T>

導出は次のとおりです。Tree<T>

私たちは、木が特定のグラフであることを知っているので、私は、ユーザーがグラフのPUBLICメソッドを使用せずに、私のグラフのクラスを拡張したいですクラス。

メイキング:

template <typename T> class Tree : public Graph<T>{ 

    . 
    . 
    . 
} 

作品が、私はグラフのクラスのメソッドと私の木の状態を変更する必要はありません。ユーザーはTreeクラス固有のメソッドを使用する必要があります。 私は自分が望むものを得るために私的な継承を使うべきだと思います。

問題は、実際にはツリーがグラフなので、私は "is a"の関係を失うことができないということです。

良いものを意味的に注文するには、良いデザインは何ですか?

ありがとうございました

+1

https://en.wikipedia。org/wiki/Circle-ellipse_problem – nwp

答えて

4

まあ、あなたは両方の方法をとることはできません。 is-aという関係は、ユーザーがTreeへのポインタ(または参照)上の任意のGraphで定義された非仮想関数、オーバーライドされていない関数を使用して、期待される結果を達成できることを意味します。

ユーザーがこれらの機能を呼び出すことを許可できない場合は、is-aの関係が定義上適切でないことを意味し、プライベート継承を選択する必要があります。

2

私的継承はあまりいい考えではありません - 詳しくはthis投稿を参照してください。

しかし、あなたは間違った方法で問題に近づいていると思います。ツリーがグラフの場合、グラフ上で実行したい操作はすべて有効です。そして、クライアントはそれをすることを許可されるべきです。操作は意味をなさない方法で構築する必要があります。いくつかの操作がそうでないとわかった場合、これはおそらく継承の正しい使用ではありません。

グラフ理論/コンビナトリアルでは、ツリーはグラフですが、コンピュータサイエンスではその関係は薄いことに注意してください。木とグラフをデータ構造として表現する方法はまったく異なり、コードを共有することは面倒です。

1

オブジェクトの向きが常にうまく機能するとは限りません。ツリーは特殊なグラフです。しかし、特殊であることは、一般的なグラフよりも制限があり、単純であり、より少ない操作しかサポートしません。したがって、任意の数のノードと任意のトポロジを許可するグラフベースを作成し、ツリーレイヤのトポロジを制限することができます。あるいは、ツリーがグラフから継承していないと言うこともできます。または、抽象的な「グラフベース」があり、それをツリー、一般グラフ、有向非循環グラフ、平衡ツリーなどでインスタンス化することができます。

私はあなたが望むものを最後にお勧めしたいと思います。したがって、nullに設定された少なくとも1つの仮想メンバ関数を持つabstract_graph基本クラスを記述します。

次に、私的に継承することができます。ツリークライアントがツリーがグラフであるかどうかを判断するかどうかによって異なります。しかし、私的継承はそれほど一般的ではありません。

+0

抽象基本クラスを作ることは良いアプローチであると思われます。 –

関連する問題