繁体   English   中英

嵌套接口继承实现

[英]Nested interface inheritance implementation

我遇到了嵌套接口声明和实现的情况,我正在寻找更好的解决方案。 我可以想到的两个可能的解决方案是在实现中包含包装对象,或者使用菱形继承。 我对包装器对象不满意,好像每个接口中都有十多个方法,那么在每个实现类级别中都会有很多包装器方法。 Diamond继承的实现更为简洁,但是我被告知要避免使用钻石继承。 在这个问题上,谁能提出比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 */ }
};

如果我要处理涉及继承的复杂设计任务,那么我会想到CRTP 但是我不确定这是否对您有帮助。 它有点取决于那些接口,类和方法的“含义”。

总的来说,这使我想到了与“设计”相关的“意义”问题。 这里有两点很重要

  • 可读性。 使其尽可能简单明了。
  • 抽象。 设计应反映出它是现实世界中某些部分的模型。

将您的两个解决方案绘制为UML(甚至没有),您可能会看到其结构非常相似。 ImplC例如具有的实例ImplB作为成员或它具有它作为父。 因此,这归结为组成与继承的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM