在父类中实现部分C++接口
Implementing partial C++ Interface in parent class
我有一个独特的情况,我需要两层接口,并希望有两层类来实现它们:
class IFood {
public:
virtual ~IFood() = default;
virtual int GetColor() const = 0;
};
class IFruit : public IFood {
public:
virtual int GetAverageSeedCount() const = 0;
};
class GreenFood : public IFood {
virtual int GetColor() const override {return GREEN;}
};
class GreenApple : public GreenFood, public IFruit {
virtual int GetAverageSeedCount() const override {return 5;}
};
(我意识到这些接口并不完全合理。对不起。)
在某些情况下,我可能有一个IFood对象的集合,但在其他情况下我会有一个IFruit对象的集合。实际上,IFood所代表的接口有5-8个功能。
如果这段代码能够编译并运行,我就会做好准备。遗憾的是,它失败了,因为编译器没有实现GreenApple
实现IFood
API(缺少GetColor
)。这确实存在于我们扩展的基本GreenFood
中,但拆分接口实现似乎不会让编译器满意。
对于IFood中的每个函数,我可以让IFruit实现它,只需直接调用ParentClass::functionName()。但IFood有5-8种功能,还有几十种潜在的水果类型,这并不像我想要的那么优雅。
我很好奇是否有什么解决方案可以让编译器在父类中找到这些缺失的API,或者有什么好的方法可以让我重组接口以保持优雅?
如果需要,我可以提供更具体的例子。谢谢你的任何提示!
对IFruit和GreenFood中的基类使用Virtual关键字。
class IFood {
public:
virtual ~IFood() = default;
virtual int GetColor() const = 0;
};
class IFruit : public virtual IFood {
public:
virtual int GetAverageSeedCount() const = 0;
};
class GreenFood : public virtual IFood {
virtual int GetColor() const override {return GREEN;}
};
class GreenApple : public GreenFood, public IFruit {
virtual int GetAverageSeedCount() const override {return 5;}
};
有几种方法可以解决这个问题。
首先,GreenApple
知道它继承了GreenFood
和IFruit
,而IFruit
继承了它自己对要实现的GetColor()
的要求,这是在GreenFood
()中实现的,所以从一个角度来看,GreenApple
有责任处理这一问题:
class GreenApple : public GreenFood, public IFruit {
virtual int GetAverageSeedCount() const override {return 5;}
virtual int getColor() const override {
return GreenFood::GetColor();
}
};
这是一个稍微干净的变体,避免了丑陋的显式类引用:
class GreenFood : public IFood {
virtual int GetColor() const override
{
return GreenFoodColor();
}
int GreenFoodColor() const
{
return GREEN;
}
};
class GreenApple : public GreenFood, public IFruit {
virtual int GetAverageSeedCount() const override {return 5;}
virtual int getColor() const override {
return GreenFoodColor();
}
};
这将起作用,但这仍然会导致GreenApple
从IFood
继承两次。这可能会产生自己的问题。
避免重复继承的另一种解决方案是不让IFruit
直接从IFood
继承,而是要求其子类以某种方式从该接口继承:
class IFruit {
public:
virtual int GetAverageSeedCount() const = 0;
virtual IFood &getIFood()=0;
virtual const IFood &getIFood() const=0;
};
class GreenApple : public GreenFood, public IFruit {
virtual int GetAverageSeedCount() const override {return 5;}
virtual IFood &getIFood() override { return *this; }
virtual const IFood &getIFood() const { return *this; }
};
任何观察IFruit
的人都知道有一个IFood
藏在这里的某个地方。也许把operator IFood &
放进去,让整个过程更加透明。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?