2014-06-26 49 views
-1

以下是当前的代码设计(示例)。我怎样才能避免重复“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"; } 
}; 

感谢您的帮助!

桑托斯

+0

Stack Overflow('Can anybody suggest..')通常不允许基于观点的问题。此外,您的问题太广泛了,您可能需要针对您的每个问题分别提出问题主题。 – cybermonkey

+3

你已经提出了“现在我的问题是:”但它没有跟随一个问题,只是一些陈述,其中一些没有意义(“接口类是必须的”)。 –

+0

创建'class ParentImpl:public InterfaceParent',它实现'methodParent'并派生该类的子对象。您可以创建多个不同的实现。 – piotrekg2

回答

0

如果你看到“methodParent()”,我要实现它在所有子 类是大量的代码的重复(以及维护 障碍)对我来说。

然后执行Abstract class而不是您的接口。基本上它是一个接口(包含需要在儿童中实现的纯虚拟方法),但也包含一些“非纯”(已实现)的虚拟方法,如果需要,可以稍后重写。

通常,一个抽象类用于定义一个实现,而 旨在从具体类继承。 More here

我这样做:

// 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 
}; 

编辑如果你不能改变任何东西去为这样的:

。但它的丑陋:)

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

感谢您的回答。但我不能放松我的接口类。我已经相应地重新解释了我的问题。 – Santosh

+1

我没有看到任何变化,你能解释为什么你不能失去你的接口? –

+0

我不能丢失接口,因为过去的项目被设计为处理两个不同的库实现,其中公共接口暴露给GUI代码和最终用户。此外,所有的接口被编译为一个单独的DLL,不能与两个库链接。我希望,我的描述清楚。谢谢 ! – Santosh

1

这个问题有点奇怪,因为通常使用virtual来实际覆盖具有特定行为的方法,但在您的情况下,methodParent()始终是相同的。

您可以添加实施私有继承(见C++有效,使用多重继承明智的例子)

class InterfaceParentImpl() //Interface class 
{ 
public: 
    void methodParent() { cout << "PARENT_METHOD"; } 
}; 

class Child1 : public InterfaceChild1, private InterfaceParentImpl 
{ 
    void methodParent() { InterfaceParentImpl::methodParent(); } 
} 

你仍然需要几次写,但如果你想改变它,你需要只在一个地方做。

+0

然后我认为使用* Abstract *而不是* Interface *更合适。这样,您不仅可以避免重新定义,还可以让代码维护,因为它们位于同一个位置。另外,如果需要,您可以重新定义您的'methodParent()'到子类中。 –

+0

感谢您的回答。但我不能放松我的接口类。我已经相应地重新解释了我的问题。 – Santosh