私のプロジェクト用のインターフェイスを設計していますが、そのアイデアが成立するかどうかは不思議です。 状況: 実行時に、異なる派生オブジェクトにコマンドを発行するために、基本クラスの配列の配列を使用したいと考えています。異なる派生オブジェクトは異なる実装(仮想関数)を持っています。私の問題は:それらのオブジェクトは、インターフェイスの異なるサポートレベルを持っている場合、どのように私は空の関数を書くことを避けることができますか?例えばデザインパターン:部分的にサポートされている派生クラスのための統一インターフェイス
、(私の現在のコード)
Class Base { //this is the main interface
public:
virtual void basicFun() = 0;
virtual void funA(int input1) {return;}
virtual void funB(int input2) {return;}
virtual void funC(int input3) {return;}
}
Class Derived1 : public Base { //this class support only funA()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
}
Class Derived2 : public Base { //this class support both funA() funB()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
}
Class Derived3 : public Base { //this class support all
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
void funC(int input3) {//do something}
}
仮定:特定のオブジェクトに対して、サポートされていない関数が呼び出されることはないだろう。 basePtrが指すオブジェクトがDerived1またはDerived2の場合、BasePtr-> funC()は呼び出されません。 問題がある:
- 統一されたインタフェースが
- 希望する場合、私は空の関数は上記のように定義されている場合、コンパイラは(INPUT1〜INPUT3)私に参照されていないパラメータを警告し続けるベースまたは派生いずれかの空の関数を定義する必要があります。もちろん、私はそれをオフにすることができますが、ちょうどこのようにしないでください。
したがって、空の関数を定義せずに均一なインターフェイスを実現するために使用できるパターンはありますか?私は数日間このことについて考えてきました。それは不可能と思われる。すべてのオブジェクトを制御するためにBaseポインタ配列を使うことができるようにfunA()funB()とfunC()がインタフェースになければならないので、funB()とfunC()を何らかの方法で定義する必要があります。
感謝と幸せな感謝と、あなたのアイデアを共有してくれてありがとう。
solti
こんにちは、お返事ありがとうございます。ブレーキなしの車であなたが何を意味するのか理解できます()。しかし、何らかのOEMソフトウェアを開発している場合は、同じライブラリレベルのコードを使用し、異なるAPレベルのコードを使用することもできます。ですから、私はインターフェースを変えずにAPでいくつかのコードを変更するだけでいいと思っています。だから、一部のクライアントにとって、私はBrakeなしで彼らに車を与えたい()。それはcar-> Brake()が決して必要でないことが保証されています。 (たぶんクライアントがクラッシュテストをしている)第二に、私はトリックを省略してパラメータ名を試して、それは動作します!どうもありがとうございます! – Solti