如何减少具有相同名称但不同类型的数据成员的类上的代码重复?

时间:2009-05-08 05:20:19

标签: c++ class-design

在设计像这样的课程时遇到麻烦

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()并减少重复。

再次

4 个答案:

答案 0 :(得分:6)

这正是类模板的设计应用程序。它们允许类中的函数在不同的数据类型上运行,而无需复制算法和逻辑。

This Wikipedia page将为您提供编程模板的完整概述。

这是让你入门的基本想法:

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
}

答案 1 :(得分:0)

如果您可以控制C1和C2,则可以定义基类或抽象基类,并在Base类或第三个辅助类中处理它。

答案 2 :(得分: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; }
}

答案 3 :(得分:0)

如果您的Drived1和Derived2相同,除了成员的类型(C1和C2),那么您可以考虑使用单个类Derived和模板。 (请原谅我的语法,如果不正确,我是C#dev:D)

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

以上几行。