gpt4 book ai didi

C++将接口(interface)连接到基类

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:58 24 4
gpt4 key购买 nike

我的设计有问题。

/// 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条建议:

  1. 在函数 myNode::add() 中使用 reinterpret_cast 运算符
  2. 创建一个接口(interface) INode 并让 ImyNode 扩展这个 INode
  3. 将 ImyNode::add(ImyNode* v) 更改为 ImyNode::add(myNode* v)
  4. 让 ImyNode 扩展 Node

所有 4 个建议我都不接受。为什么?

  1. 行不通。丑陋的。坏主意
  2. 如果我没有 Node 怎么办?如果类层次结构比那更复杂怎么办?
  3. 接口(interface)不应该知道它的派生类的任何信息
  4. 不喜欢接口(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++将接口(interface)连接到基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16008544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com