0
class Model {};

class AbstractModel {};
class TableModel : public AbstractModel {};

class CustomerModel : public TableModel, public Model {};
class ItemModel : public TableModel, public Model {};
...

要件は、各 TableModel サブクラスが、すべてのサブクラス (CustomerModel、ItemModel、...) 間で共有される一連の機能を提供する必要があることです。TableModel と AbstractModel は不変であるため、一連の機能は Model クラスで定義され、各サブクラス (CustomerModel、ItemModel など) で実装されます。

ここでの問題は、アプリケーションの他の部分が AbstractModel ポインターにしかアクセスできないことです。Model で定義された一連の機能にアクセスするには、このポインターを AbstractModel から Model にキャストする必要があります (各 TableModel サブクラスも Model を実装すると仮定します)。 )。

dynamic_cast を使用せずにそうする可能性はありますか? 同じ機能を提供する別の設計に対する推奨事項はありますか?

4

2 に答える 2

0

まず、なぜ dynamic_cast を使わないのでしょうか?

次に、TableModel を Model から継承させてみませんか? (結局のところ、「テーブル モデル」は「モデル」の特殊化されたバージョンのように聞こえます)

「不変」とは、Java/.NET の意味で、オブジェクトが作成されるとその状態を変更できないという意味ですか? それとも、ライブラリの一部であるため、クラスを変更できないということですか? 私の最初の推測は最初でした。

dynamic_cast (C++ の RTTI 機能の一部) を使用したくない場合は、独自の形式の RTTI を実装する必要があります。たとえば、Microsoft の MFC は、実行時の型情報を含む CObject スーパークラスからすべてのクラスを派生させることによってこれを行います。Microsoft COM は、基本的に dynamic_cast と同等の QueryInterface メソッドを含む IUnknown インターフェイスから派生するすべてのインターフェイスを要求することによってもこれを行います。

于 2012-11-26T16:19:20.133 に答える