我遇到嵌套接口声明和实现的场景,我正在寻找更好的解决方案。我能想到的两种可能的解决方案是在实现中使用包装器对象,或者使用钻石继承。我不满足于包装器对象,好像我在每个接口中有十个以上的方法,然后在每个级别的实现类中都会有很多包装器方法。钻石继承实现更简洁,但我被告知尽可能避免使用钻石继承。任何人都可以建议一个比这个问题中的2更好的解决方案吗?
包装器对象实现是
class IA
{
public:
virtual void MA() = 0;
};
class IB : public IA
{
public:
virtual void MB() = 0;
};
class IC : public IB
{
public:
virtual void MC() = 0;
};
class ID : public IC
{
public:
virtual void MD() = 0;
};
// ------------------------
class ImplA : public IA
{
public:
void MA() { /* do A */ }
};
class ImplB : public IB
{
public:
void MA() { a.MA(); }
void MB() { /* do B */ }
private:
ImplA a;
};
class ImplC : public IC
{
public:
void MA() { b.MA(); }
void MB() { b.MB(); }
void MC() { /* do C */ }
private:
ImplB b;
};
class ImplD : public ID
{
public:
void MA() { c.MA(); }
void MB() { c.MB(); }
void MC() { c.MC(); }
void MD() { /* do D */ }
private:
ImplC c;
};
钻石继承的例子是
class IA
{
public:
virtual void MA() = 0;
};
class IB : public virtual IA
{
public:
virtual void MB() = 0;
};
class IC : public virtual IB
{
public:
virtual void MC() = 0;
};
class ID : public virtual IC
{
public:
virtual void MD() = 0;
};
// ------------------------
class ImplA : public virtual IA
{
public:
void MA() { /* do A */ }
};
class ImplB : public IB, public virtual ImplA
{
public:
void MB() { /* do B */ }
};
class ImplC : public IC, public virtual ImplB
{
public:
void MC() { /* do C */ }
};
class ImplD : public ID, public ImplC
{
public:
void MD() { /* do D */ }
};
答案 0 :(得分:0)
如果我面临复杂的设计任务,其中涉及的是继承,那么我会想到CRTP。但我不确定这是否会对你有所帮助。它有点依赖于那些接口,类和方法的“含义”。
这让我想到了与“设计”有关的“意义”问题。这里有两点很重要
将您的两个解决方案绘制为UML(甚至没有它),您可能会发现结构非常相似。例如,ImplC
有一个ImplB
实例作为成员,或者它作为父项。所以这归结为composition vs inheritance。