C++ 如何避免代码重复而不丢失接口?

C++ 如何避免代码重复而不丢失接口?,c++,inheritance,design-patterns,C++,Inheritance,Design Patterns,下面是当前的代码设计(示例)。如何避免重复“methodParent()”(在两个子类的实现中)的代码而不丢失接口类 //Interfaces //======================================================= class InterfaceParent() //Interface class { public: virtual void methodParent() = 0; }; class InterfaceChil

下面是当前的代码设计(示例)。如何避免重复“methodParent()”(在两个子类的实现中)的代码而不丢失接口类

//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(){堆栈溢出通常不允许提出主要基于意见的问题(
任何人都可以建议..
)。此外,您的问题太广泛,可能需要针对每个问题提出单独的问题线索。您已经提出了“现在我的问题是:但后面没有问题,只有一些语句,其中一些没有意义(“接口类是必须的”).Create
class 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();  } 
}