1

私は現在、クラスライブラリの設計段階にあり、「RTTIを使用せずに中央マネージャーで多様なクラスを管理する」または「dynamic_castを回避するためのパターン」に似た質問に出くわしました。

基本クラスBaseと、 BaseのサブクラスであるDerivedADerivedBの2つのクラスを持つクラス階層があるとします。私のライブラリのどこかに、 DerivedADerivedBの両方のタイプのオブジェクトのリストを保持する必要があるクラスがあります。さらに、このクラスは、タイプに応じて両方のタイプでアクションを実行する必要があると想定します。明らかに、ここでは仮想関数を使用してこの動作を実装します。しかし、 DerivedA型のすべてのオブジェクトを提供するために管理クラスが必要な場合はどうなりますか?

クラス階層のサブセットに対してのみアクションを実行する必要があるため、これは悪いクラス設計の指標ですか?

それとも、私の管理クラスがBaseのリストを使用するのではなく、 DerivedA用とDerivedB用の2つのリストを使用する必要があるということですか?したがって、両方のタイプでアクションを実行する必要がある場合は、2つのリストを反復処理する必要があります。私の場合、階層に新しいサブクラスを追加する必要がある可能性は非常に低く、現在の数は約3または4サブクラスです。

4

3 に答える 3

3

しかし、DerivedA 型のすべてのオブジェクトを提供する管理クラスが必要な場合はどうすればよいでしょうか。

クラス階層のサブセットに対してのみアクションを実行する必要があるため、これはクラス設計が不適切であることを示していますか?

いいえよりもイエスの可能性が高いです。これを頻繁に行う必要がある場合は、階層が理にかなっているかどうかを疑問視するのが理にかなっています。その場合、これを関連のない 2 つのリストに分ける必要があります。

別の可能なアプローチは、仮想メソッドを介してそれを処理することです。たとえば、DeriveBそれに影響を与えないメソッドの操作なしの実装があります。詳しい情報を知らずに判断するのは困難です。

于 2013-03-20T10:58:50.147 に答える
2

別の方法で処理する必要があるオブジェクト (へのポインター) を一緒に格納する場合、それは確かに悪い設計の兆候です。

ただし、この異なる動作を基本クラスの空の関数として実装するか、ビジター パターンを使用することもできます。

于 2013-03-20T10:58:32.210 に答える
-1

いくつかの方法でそれを行うことができます。

  • 特定のクラスを試してみてくださいdynamic_cast(これは力ずくの解決策ですが、インターフェイスにのみ使用します。クラスに使用するのは一種のコードの匂いですが、うまくいきます。)
  • 次のようにします。

    class BaseRequest {};
    class DerivedASupportedRequest : public BaseRequest {};
    

    次に、メソッドをサポートするようにクラスを変更します。

    // (...)
    void ProcessRequest(const BaseRequest & request);
    
  • bool TryDoSth()基本クラスで仮想メソッドを作成します。DerivedBは常に false を返しますがDerivedA、必要な機能を実装します。

  • 上記の代替: Create method Supports(Action action)。ここで、Actionは可能なアクションまたはアクションのグループを定義する列挙型です。DoSth()このような場合、特定の機能をサポートしていないクラスを呼び出すと、例外がスローされます。
  • 基本クラスにはメソッドがある場合がありActionXController * GetControllerForX()ます。DerivedAは実際のコントローラーを返し、DerivedBを返しnullptrます。
  • 同様に、基本クラスは次のメソッドを提供できます。BaseController * GetController(Action a)

それが悪い設計であるかどうか、あなたは尋ねました。どれだけ機能が共通でどれだけ違うかによると思います。共通のメソッドが 100 あり、異なるメソッドが 1 つしかない場合、これらのデータを別々のリストに保持するのは奇妙です。ただし、さまざまなメソッドの数が目立つ場合は、アプリケーションの設計を変更することを検討してください。これは一般的なルールかもしれませんが、例外もあります。文脈がわからないとわかりにくいです。

于 2013-03-20T11:06:58.257 に答える