在设计像这样的课程时遇到麻烦
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()并减少重复。
再次答案 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;
}
以上几行。