2

C++ でのインターフェイスの実装について質問があります。

インターフェースがあるとします:

class A
{
 virtual void f() = 0;
};

これを実装するとき、私は次のようなことをする方法があるのだろうかと思います:

class B : public A {     
  void f(int arg=0) {....} // unfortunately it does not implement f() this way
};

インターフェースをきれいに保ちたい。クライアント コードがパブリック インターフェイス A を介して呼び出すと、arg は常に自動的に 0 に設定されます。ただし、B を介して呼び出す場合は、arg を別の値に設定して呼び出す柔軟性があります。それは達成可能ですか?

編集: 私はインターフェースと実装を管理しているので、提案、マクロ、テンプレート、ファンクター、その他の意味のあるものは何でも受け入れます。最小限でクリーンなコードベースが欲しいだけです。クラスは大きく、実際の実装に単純に転送する別の関数など、絶対に必要でないコードは書きたくありません。

EDIT2:少し明確にしたい:パブリックインターフェースはクライアントに提供されます。これは、内部でのみ使用されるクラス B インターフェースよりも制限的です。ただし、関数 f() は、入力引数に基づいてわずかに異なる処理を除いて、本質的に同じことを行っています。実際のクラスにはかなりの数のインターフェイス関数があり、署名は複雑です。関数転送をすばやく行うと、退屈なコードの繰り返しが発生し、B の内部インターフェイスが汚染されます。これを C++ で処理する最良の方法は何だろうか。

ありがとう!

4

4 に答える 4

0

関数転送をすばやく行うと、退屈なコードの繰り返しが発生し、B の内部インターフェイスが汚染されます。これを C++ で処理する最善の方法は何だろうか。

プロセスの一部を自動化するには、スクリプトを作成する必要があるようです。

于 2013-09-08T08:31:36.827 に答える
0

あなたの説明から、特定の責任を持つ2つのクラスを提供する必要があると思います.1つは目的の機能を実装し、もう1つはクライアントに必要なインターフェースを提供します。そうすれば、懸念事項を分離し、SRP に違反することはありません。

class BImpl {
public:
  doF(int arg);  
};

class B : public A {
  BImpl impl;
public:
  virtual void f() override {
    impl.doF(0);
  }
};
于 2013-09-08T08:03:33.397 に答える