次の簡略化されたC++クラス階層を例に挙げてください。私が達成したいのは、Service
が任意のModel
オブジェクトを保存する仮想メソッドを提供するということです。しかし、Service
の各サブクラス、例えば。 BoxService
は、Box
オブジェクトのみ保存してください。私の質問は、そのための任意の好適な設計パターンやベストプラクティスがあるさC++共変量パラメータ - デザインパターン
void save(Box box);
:
によりC++は、メソッドのパラメータに共分散をサポートしていないという事実に私は単純に同じようBoxService.h
に保存する方法を宣言することはできません問題?または、到着するModelオブジェクトがBox型で、それ以外の場合は例外をスローすると、save関数の実装をBoxService.cpp
でチェックする必要がありますか? Model.h
class Model {
private:
int id;
};
Box.h
class Box : public Model {
private:
int size;
};
Service.h
class Service {
public:
virtual void save(Model model);
};
BoxSe rvice.h
class BoxService : public Service {
public:
void save(Model box);
};
BoxService.cpp
void BoxService::save(Model box) {
// TODO: save box and make sure that box is of type 'Box' and not any other subtype of 'Model'
}
これは多型を破ります。 'Service'を与えられ、' save(model) 'を呼び出すと、' BoxService'が与えられると失敗しません。反対のパラメータは逆になります。 'Service'が' Box'をセーブすることができるならば、 'BoxService'は' Model'をパラメータとして受け取ることができます。 'Service'を通る呼び出し者は' Model'sである 'Box'esを渡しますが、' BoxService '' Model'型を渡すことができます。これはC++がサポートしていないものです。 – chris
'BoxService'は' Service'を継承するのはなぜですか?りんごの袋は果物の袋ではありません。 – aschepler
私は同意します!ポリモーフィズムを破ることなく、上記のようなデザインをレイアウトすることも可能ですか? –