类似但不兼容的类

Similar but incompatible classes

本文关键字:不兼容      更新时间:2023-10-16

对于以下问题(在C++中),什么是好的实践?

我想实现两个(以及以后的更多)类,它们非常相似,但应该是不兼容的。例如,我将它们命名为class Appleclass Orange。显然,它们有共同的特性,比如物种、年龄、位置等等,但苹果对象永远不应该被指定给橙色变量。

更重要的是:应该有成员函数接受(或返回)自己的类,而不是其他类。例如,类Apple将具有:Apple[] getAllFromTheSameTree();,类Orange将具有:Orange[] getAllFromTheSameTree();,还有类似于void addToSameTree(Apple)等的内容,考虑到苹果不能与桔子在同一棵树上。

一个想法是有一个抽象的根类(class Fruit)来定义公共属性。但这将允许函数接受Fruit类型的参数,如果可能的话,我想禁止它)。

另一个想法是模板:Fruit<Apple>Fruit<Orange>(Apple和Orange在这里是一些伪空类型)。

一个想法是有一个抽象根类(class Fruit),它将定义公共属性

是的,这就是我建议你的想法。

但这将允许函数接受Fruit类型参数,如果可能的话,我想禁止)。

好吧,这不是问题。因为是抽象的,所以不可能有Fruit类型的对象

例如,具有此签名的函数:

void consume_fruit(Fruit& fruit)

将接受任何种类的水果(AppleOrange)。由于Fruit是抽象的,它不会仅仅因为Fruit类型的对象不存在而接受Fruit类型的对象。

相似性集合(例如std::vector<std::shared_ptr<Fruit>>)将包含源自Fruit(AppleOrange)的类型的对象,但同样不可能存在Fruit类型的对象。