3

C++ 継承構造を作成する場合、複数の場所でまったく同じメンバー関数を定義する必要があります。

B が抽象基本クラスで、D、E、および F がすべて B から継承されている場合、次のようになります。

class B
{
   virtual func A( ... params ) = 0;
};

class D : public B
{
   func A( ... params );
};

/* ... etc... similar implementations for E and F */

したがって、ここには明らかに重複があります。B へのインターフェイスが大きい場合、インターフェイスを変更する必要がある場合、変更する場所が多くなる可能性があります。

同僚は、巧妙に作成された #includes を埋め込んだいくつかの策略を提案しました。

class D: public B
{
   #include "B_Interface.h"  // B_Interface.h is a specially crafted .h file
}

これは少し不器用に見えますか?それは...ですか?二重メンテナンスを避けるためのより良い解決策はありますか?

また、ここでの解決策は、Visual Assist X のような言語をサポートするための本当に優れたツールでしょうか?

編集:派生クラスには一意の実装が必要であると仮定します。

4

5 に答える 5

12

実際、インターフェイスを変更する際の最大の問題は通常、それを実装するコードではなく、それを使用するすべてのコードです。実装者にとって簡単に変更できるとしたら、おそらくユーザーにとっては面倒なことになるでしょう。

于 2010-03-01T21:02:44.133 に答える
4

また、ここでの解決策は、Visual Assist X のような言語をサポートするための本当に優れたツールでしょうか?

丁度。メソッド シグネチャの変更は、リファクタリング ツールの重要な機能です。

于 2010-03-01T21:42:02.053 に答える
4

広く使用されているインターフェイスを変更するのが面倒なのはバグではありません。それは特徴です。

于 2010-03-01T21:15:56.317 に答える
1

デフォルトの動作で何度も実装する必要がある場合は、純粋な仮想ではなく、単に仮想にする必要があります。

于 2010-03-01T20:59:18.783 に答える
1

使用すべきではない別の方法でプリプロセッサを使用する代わりに、私は自分のエディタ (またはそれが好きな場合は IDE) を試してみます。

于 2010-03-01T21:07:22.827 に答える