请引用下面的例子。
using namespace std;
//Base interface
class IBase
{
public:
virtual void BaseMethod1() = 0;
virtual void BaseMethod2() = 0;
};
class IEntity1 : public IBase
{
public:
virtual void Entity1Method1() = 0;
virtual void Entity1Method2() = 0;
};
class Entity1 : public IEntity1
{
public:
Entity();
//IBaseMethods
void BaseMethod1();
void BaseMethod2();
//IEntityMethods
void Entity1Method1();
void Entity1Method2();
//EntityMethods
void Method1();
void Method2();
};
在上面的示例中,对于从 IBase 派生的所有其他实体,需要实现 BaseMethod1() 和 BaseMethod2()。因此会出现大量代码重复?无论如何,我们可以避免在从它派生的实体中冗余实现 IBase 方法吗?
最佳答案
您可以结合使用虚拟继承和默认基实现类来封装您的默认基行为,并使其仅由您想要的具体类继承,如下所示:
using namespace std;
//Base interface
class IBase
{
public:
virtual void BaseMethod1() = 0;
virtual void BaseMethod2() = 0;
};
class IEntity1 : virtual public IBase
{
public:
virtual void Entity1Method1() = 0;
virtual void Entity1Method2() = 0;
};
class BaseImpl : virtual public IBase
{
public:
virtual void BaseMethod1()
{
...
}
virtual void BaseMethod2()
{
...
}
}
class Entity1 : public IEntity1, public BaseImpl
{
public:
Entity1();
//IEntityMethods
void Entity1Method1();
void Entity1Method2();
//EntityMethods
void Method1();
void Method2();
};
但是,有一个 runtime cost与虚继承有关。多重继承也伴随着一些结构性问题,例如基类构建。
您甚至可以从模板类中获得一些乐趣,使您的类组合更加模块化:
template<typename TEntity, typename TBaseImpl>
class ConcreteEntity: public TEntity, public TBaseImpl
{
public:
ConcreteEntity() {}
};
class ConreteEntity1 : public ConcreteEntity<IEntity1, BaseImpl>
{
public:
ConreteEntity1();
//IEntityMethods
void Entity1Method1();
void Entity1Method2();
//ConreteEntity1 Methods
void Method1();
void Method2();
};
关于c++ - 避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21669489/