2

このようなクラスを設計するときに問題が発生します

class C1 {
public:
  void foo();
}

class C2 {
public:
  void foo();
}

C1とC2には同じメソッドfoo()があり、

class Derived1 : public Base {
public:
  void Update() {
    member.foo();
  }
private:    
  C1 member;
}

class Derived2 : public Base {
public:
  void Update() {
    member.foo(); 
  }
private:    
  C2 member;
}

両方のDerivedクラスのUpdate()はまったく同じですが、メンバーのタイプが異なります。したがって、新しい派生クラスごとにUpdate実装をコピーする必要があります。

これは、このコードの重複を減らす方法ですか?私はマクロを使った解決策しか出てきません。テンプレートを使ってこれを解決するもっとエレガントな方法があると思いますが、私にはわかりません。

編集: たくさんの人に感謝しますが、私は何かを逃したと思います。

1.私はc++を使用しています

2.実際には、各Derivedクラスには約5つのメンバーがあり、それらはすべてfoo()メソッドを提供し、同じ基本クラスから派生しています。私の状況では、(非常に長い)Update()メソッドを既に作成しており、変更なしですべての派生クラスで機能します。したがって、このUpdate()をコピーしてすべての新しいクラスのUpdate()に貼り付けるだけで、ひどいコードの重複が発生します。Update()を書き直さなくても、重複を減らすことができる方法があるのではないかと思います。

再びthx

4

4 に答える 4

6

これはまさに、クラステンプレートが設計されている種類のアプリケーションです。これらにより、クラス内の関数は、アルゴリズムやロジックをコピーすることなく、さまざまなデータ型で動作できます。

このウィキペディアのページでは、プログラミングのテンプレートの概要を説明しています。

始めるための基本的な考え方は次のとおりです。

template  <class T>
class CTemplateBase
{
public:
    void Update()
    {
        member.foo();
    }
private:
    T member; // Generic type
}

class CDerived1 : public CTemplateBase<C1>
{
    // No common algorithms required here
}

class CDerived2 : public CTemplateBase<C2>
{
    // No common algorithms required here
}
于 2009-05-08T05:27:56.333 に答える
0

C1とC2を制御できる場合は、基本クラスまたは抽象基本クラスを定義して、基本クラスまたは3番目のヘルパークラスで処理できます。

于 2009-05-08T05:27:34.167 に答える
0

メソッドを親クラスに移動します。

class IFooable {
public:
  virtual void foo() = 0;
}

class C1 : IFooable {
public:
  void foo();
}

class C2 : IFooable {
public:
  void foo();
}

class Base {
public:
  void Update() {
    member->foo(); 
  }
private:    
  IFooable* member
}

class Derived1 : public Base {
  Derived1 () : member(new C1()) {}
  ~Derived1 () { delete member; }
}

class Derived2 : public Base {
  Derived2 () : member(new C2()) {}
  ~Derived2 () { delete member; }
}
于 2009-05-08T05:29:11.573 に答える
0

Drived1とDerived2がメンバーのタイプ(C1とC2)を除いて同じである場合は、単一のクラスDerivedとテンプレートの使用を検討できます。(正しくない場合は構文を失礼します、im C#dev:D)

template <class T>
class Derived : public Base {
public:
  void Update() {
    member.foo();
  }
private:    
  T member;
}

上記の行に何か。

于 2009-05-08T05:34:18.097 に答える