我有几个抽象基类,它们的行为类似Java或C#中已知的接口,假设它们是A,B和C.
现在我有一些具体的类,每个类都实现了接口的子集:
class Concrete1: public A, public B
class Concrete2: public A, public C
class Concrete3: public A, public C
在某些时候,我想要一个方法,要求它的参数实现A和C(所以应该可以通过Concrete2和Concrete3)。
我能做到
class AC: public A, public C
class Concrete1: public A, public B
class Concrete2: public AC
class Concrete3: public AC
并接受指向AC的指针,但我不喜欢这种方法,因为它可能会以类似
的方式结束class AC: public A, public C
class AB: public A, public B
class ABC: public A, public B, public C
class Concrete1: public AB
class Concrete2: public AC
class Concrete3: public AC
class Concrete4: public AC, public AB, public ABC
有什么好的选择吗?
非常感谢!
答案 0 :(得分:2)
首先,如果这些是公共抽象基类,并且您希望能够将它们用作接口类型,则它们需要是虚拟的 - 否则您将获得重复的基础和模糊问题。
那就是说,如果你需要能够接受既是'A'又有'C'的东西,那么确实有一个'AC'抽象基类,所以你应该只是声明它。
答案 1 :(得分:1)
我认为没有好的选择。因为这个问题是由初始接口故障时的错误引起的。
如果它的负担很重,接口重新设计是真正的好选择。
或者你可以用模板方法,dynamic_cast,盲C风格演员来克服。或者为每个接口制作两种方法。
答案 2 :(得分:0)
如果AB
,AB
和ABC
只是接口而且没有任何一个添加任何new
功能,那么为什么不呢?写:
class Concrete4: public ABC
而不是
class Concrete4: public AC, public AB, public ABC
他们不是一回事吗?
当然,如果派生接口为其添加了新功能,那么它们就不一样了!
同样,您可以使用ABC
和AB
代替C
,A
和B
来撰写C
:
//class ABC: public A, public B, public C
class ABC: public AB, public C
注意:我假设A
,B
,C
,AB
,AC
和ABC
都是接口。即它们都包含纯虚函数而不定义它们。除了具有基本接口的功能之外,它们都没有向自身添加任何新功能。