C++ 如何避免代码重复而不丢失接口?
下面是当前的代码设计(示例)。如何避免重复“methodParent()”(在两个子类的实现中)的代码而不丢失接口类C++ 如何避免代码重复而不丢失接口?,c++,inheritance,design-patterns,C++,Inheritance,Design Patterns,下面是当前的代码设计(示例)。如何避免重复“methodParent()”(在两个子类的实现中)的代码而不丢失接口类 //Interfaces //======================================================= class InterfaceParent() //Interface class { public: virtual void methodParent() = 0; }; class InterfaceChil
//Interfaces
//=======================================================
class InterfaceParent() //Interface class
{
public:
virtual void methodParent() = 0;
};
class InterfaceChild1() : public InterfaceParent //Interface class
{
public:
virtual void methodParent() = 0;
virtual void methodChild1() = 0;
};
class InterfaceChild2() : public InterfaceParent //Interface class
{
public:
virtual void methodParent() = 0;
virtual void methodChild2() = 0;
};
// Concrete Classes
//=========================================================
class Child1() : public InterfaceChild1 // Concrete Class
{
public:
void methodParent() { cout << "PARENT_METHOD"; }
void methodChild1() { cout << "CHILD_1_METHOD"; }
};
class Child2() : public InterfaceChild2 // Concrete Class
{
public:
void methodParent() { cout << "PARENT_METHOD"; }
void methodChild2() { cout << "CHILD_2_METHOD"; }
};
//接口
//=======================================================
类InterfaceParent()//接口类
{
公众:
虚拟void methodParent()=0;
};
类InterfaceChild1():公共接口租金//接口类
{
公众:
虚拟void methodParent()=0;
虚拟void methodChild1()=0;
};
类InterfaceChild2():公共接口租金//接口类
{
公众:
虚拟void methodParent()=0;
虚拟void methodChild2()=0;
};
//具体类别
//=========================================================
类Child1():公共接口Child1//具体类
{
公众:
void methodParent(){cout
如果您看到“methodParent()”,我需要在所有子系统中实现它
类和大量代码的重复(以及维护)
跨栏)对我来说
然后实现一个而不是您的接口。基本上,它是一个接口(包含需要在子级中实现的纯虚拟方法),但也包含一些“非纯”(已实现)虚拟方法,如果需要,可以稍后重写
一般来说,抽象类用于定义实现和
由具体类继承。
我会这样做:
// abstract
class AParent() //Abstract class
{
public:
virtual void methodParent() { ... }; // give a first implementation that can be overriden later on, only if needed
virtual void methodeChild() = 0
};
//Now the concretes
class Child1() : public AParent
{
public:
virtual void methodParent() { ... }; // Override (as an example, only if needed)
virtual void methodChild() { ... }; //implement
};
class InterfaceChild() : public AParent
{
public:
//void methodParent() // is inherited from AParent
virtual void methodChild() { ... }; // implement
};
编辑如果无法更改任何内容,请执行以下操作:
但是……它很难看:)
//接口
//=======================================================
类InterfaceParent()//接口类
{
公众:
虚拟void methodParent()=0;
};
类InterfaceChild1():公共接口租金//接口类
{
公众:
虚拟void methodParent()=0;
虚拟void methodChild1()=0;
};
类InterfaceChild2():公共接口租金//接口类
{
公众:
虚拟void methodParent()=0;
虚拟void methodChild2()=0;
};
//摘要
//=======================================================
//用于在interfacesChildXX和具体类之间进行转换的抽象类
类AChildXX():公共接口Childxx//具体类
{
公众:
virtual void methodParent(){cout这个问题有点奇怪,因为您通常会使用virtual来实际重写具有类特定行为的方法,但在您的情况下methodParent()总是相同的
可以添加实现的私有继承(参见有效C++,例如使用多继承性)
class InterfaceParentImpl()//接口类
{
公众:
void methodParent(){堆栈溢出通常不允许提出主要基于意见的问题(任何人都可以建议..
)。此外,您的问题太广泛,可能需要针对每个问题提出单独的问题线索。您已经提出了“现在我的问题是:但后面没有问题,只有一些语句,其中一些没有意义(“接口类是必须的”).Createclass ParentImpl:public InterfaceParent
,它实现了methodParent
并从该类派生子类。您可以使用不同的实现创建多个子类。@Santosh这仍然是错误的。这不是您的问题;您的问题是我想知道如何避免代码重复而不丢失e接口?
。此外,今后,请不要忽略高级代表用户(如我自己)的建议编辑,因为您的问题中仍然有错误。@zyboxinternational我已经编辑了我的问题。我希望现在更好。谢谢您的帮助。然后我认为使用摘要而不是界面更合适。这样不仅可以避免重新定义,而且可以维护您的代码,因为它位于一个位置。此外,您还可以重新定义罚款你的methodParent()
如果需要,请加入子类。谢谢你的回答。但是我不能放松我的接口类。我已经相应地重新措辞了我的问题。谢谢你的回答。但是我不能放松我的接口类。我已经相应地重新措辞了我的问题。我没有看到任何变化,你能解释一下为什么你不能放松你的接口吗?我不能放松接口,因为该项目在过去被设计为处理两个不同的库实现,具有向GUI代码和最终用户公开的公共接口。此外,所有接口都作为单独的dll编译,不能与两个库链接。我希望,我的描述很清楚。谢谢!我认为这是一个严重的设计缺陷但是w/e。请确保您不能更改这部分代码,不要偷懒:)谢谢您的时间。我只是想用“class AChildXX():public InterfaceChildXX”行来说明我自己。这里,InterfaceChildXX表示所有接口子类(即InterfaceChild*),对吧?顺便说一句:我和我的协调员谈过了,我不允许修改接口。你的解决方案并没有那么难看!因为至少有一次我有12个孩子和20个常用方法,我使用宏的方式更难看。
//Interfaces
//=======================================================
class InterfaceParent() //Interface class
{
public:
virtual void methodParent() = 0;
};
class InterfaceChild1() : public InterfaceParent //Interface class
{
public:
virtual void methodParent() = 0;
virtual void methodChild1() = 0;
};
class InterfaceChild2() : public InterfaceParent //Interface class
{
public:
virtual void methodParent() = 0;
virtual void methodChild2() = 0;
};
//Abstract
//=======================================================
//an abstract class to do the transition betwin interfacesChildXX and concrete classes
class AChildXX() : public InterfaceChildXX // Concrete Class
{
public:
virtual void methodParent() { cout << "PARENT_METHOD"; } //It's implemented here for all your childrens, but can still be overriden
virtual void methodChildXX() = 0;
};
// Concrete Classes
//=========================================================
class Child1() : public AChildXX // Concrete Class
{
public:
//void methodParent() { cout << "PARENT_METHOD"; } //It's inherited
void methodChild1() { cout << "CHILD_1_METHOD"; }
};
class Child2() : public AChildXX // Concrete Class
{
public:
// void methodParent() { cout << "PARENT_METHOD"; } //It's inherited
void methodChild2() { cout << "CHILD_2_METHOD"; }
};
class InterfaceParentImpl() //Interface class
{
public:
void methodParent() { cout << "PARENT_METHOD"; }
};
class Child1 : public InterfaceChild1, private InterfaceParentImpl
{
void methodParent() { InterfaceParentImpl::methodParent(); }
}