2009-05-08 115 views
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; 
} 

更新()是完全相同的,但类型的成员是不同的。 所以我必须复制每个新派生类的更新工具。

这是一种减少这种代码重复的方法吗?我只用宏解决问题。 我觉得这是有模板来解决这个更优雅的方式,但我不出来..

编辑: 感谢了很多人,但我想我错过了什么..

1。我正在使用C++

2.实际上,每个Derived类都有大约5个成员,它们都提供了foo()方法并从相同的基类派生。我的情况是,我已经编写了一个(非常长的)Update()方法,它可以在没有任何修改的情况下适用于每个派生类。所以我只是将这个Update()复制并粘贴到每个新类的Update()中,这会导致可怕的代码重复。我想知道是否有一种方法可以避免重写Update(),并且可以减少重复。

THX再次

回答

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 
} 
+2

而不是那些派生的,为什么不只是:“typedef Dervied1 CTemplateBase ;”和“typedef Dervied2 CTemplateBase ;” (显然派生不再是一个好名字,但你明白了)。 – user83255 2009-05-08 06:13:53

+0

@ilproxil - 是的,我想这是可以接受的。但我会留下它,因为它是为了清晰起见。 – LeopardSkinPillBoxHat 2009-05-11 06:26:35

0

如果有超过C1和C2的控制下,你可以定义一个基类或一个抽象基类,并在基类或第三辅助类处理它。

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; } 
} 
+0

这是C++,而不是C#。成员将需要成为一个指针,而不是一个实例。多态性不仅不起作用,而且不会编译。我认为你在正确的轨道上,我更喜欢这个模板解决方案(虽然我有麻烦提出一个非主观原因)。 – 2009-05-08 05:37:33

+0

谢谢,它在我的C++上已经有一段时间了。成员已被更改为指针。 – 2009-05-08 06:11:55

+0

如果您要删除IFooable *类型的指针,IFooable也需要一个虚拟析构函数。 – 2009-05-08 12:14:51

0

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

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

东西上述线。

相关问题