我的设计有问题。

/// Generic class. Not owned by myself
class Node
{
    add(Node* v) { /* do somthing */ }
 };

/// interface writtern by myself
class ImyNode
{
    add(ImyNode* v) = 0;

    /// More functions
};

/// Implement ImyNode, use Node for implementation of SOME functions.
class myNode:
    public ImyNode,
    public Node
{
    add(ImyNode* v) { Node::add(v); } // Error: ImyNode is not a type of Node
};

该错误当然是正确的。毫不奇怪。
但是我需要一个解决方案。如何解决此编译错误。

我有4条建议:
  • 在函数myNode::add()中使用reinterpret_cast运算符
  • 创建一个接口(interface)INode并让ImyNode扩展此INode
  • 将ImyNode::add(ImyNode * v)更改为ImyNode::add(myNode * v)
  • 让ImyNode扩展节点

  • 所有4条建议对我来说都是 Not Acceptable 。为什么?
  • 不起作用。丑陋。坏主意
  • 如果我不拥有Node怎么办?如果类层次结构更复杂怎么办?
  • 接口(interface)应该不了解其派生类
  • 不喜欢接口(interface)扩展非接口(interface)类。即使我走了这条路,在没有ImyNode CTOR的情况下如何调用Node CTOR

  • 如果有人有更好的设计或优雅的解决方案,或者可以说服我,我的建议之一就是好,请这样做。

    谢谢。

    最佳答案

    您的层次结构已损坏,您需要重新考虑它。

    如果有人以您没有想到的方式扩展ImyNode怎么办

    class IUnexpectedNode : public ImyNode {}; // note: not inheriting Node
    

    然后调用您的myNode::add
    IUnexpectedNode unexpected;
    myNode my;
    my.add(unexpected);
    

    届时您将无法履行义务。

    更新

    如果您假定每个ImyNode最终也是一个Node,那么最简单的履行义务的方法就是更改ImyNode::add()的签名。
    class ImyNode
    {
      virtual void add(Node*) = 0; // This method follows the Node::add(Node*)
                                   // signature, although the classes are unrelated.
                                   // The intent is that each class that implements
                                   // ImyNode also extends Node, so the two methods
                                   // merge into one.
    
    };
    

    关于c++ - C++连接接口(interface)到基类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16008544/

    10-11 16:51