- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我正在编写一个处理一篮子水果的机器人。橙子需要榨汁,苹果需要切片,香蕉需要去皮。幸运的是,我们的机器人拥有榨汁、切片和去皮所需的精确工具。
Robot::processFruit(List<Fruit*> basket)
{
foreach(Fruit *fruit, basket)
{
if( ? ) { juiceIt(fruit); }
else if( ? ) { sliceIt(fruit); }
else if( ? ) { peelIt(fruit); }
}
}
这是我偶尔遇到的一个问题的一般示例。我有一种直觉,我的设计有问题,以至于我什至被引导到 processFruit()
函数,因为我使用的是面向对象的语言,但它似乎没有有一个干净的解决方案来解决这个问题。
我可以创建一个 enum FruitType { Orange, Apple, Banana}
然后要求每个水果实现 virtual FruitType fruitType()
,但似乎我只是重新实现类型系统。
或者我可以有函数 virtual bool isOrange();虚拟 bool isApple(); ...
但正如我们所见,这很快就会失控。
我也可以使用 C++ 的 typeid
,但是 this wikibook说
RTTI should only be used sparingly in C++ programs.
所以我不愿意采用这种方法。
在面向对象程序的设计中,我似乎一定遗漏了一些基本和关键的东西。 C++ 是关于继承和多态性的,那么有没有更好的方法来解决这个问题?
更新:我喜欢拥有一个所有Fruit
都需要实现的通用process()
函数的想法。但是,如果我现在想添加一个 Lemon
并想榨汁怎么办?我不想重复榨汁代码,所以我应该创建一个 class Juicable : public Fruit
并让 Oranges 和 Lemons 都成为 Juicable
吗?
最佳答案
参见 Tell, don't ask :
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things.
— Alec Sharp
你想定义一个 Fruit
基类,它有一个虚拟的 process
方法。苹果、橙子和香蕉都将实现各自的 process
版本,该版本为该类型的水果做正确的事情。您的机器人需要做的就是将下一个 Fruit*
从篮子里拉出来,然后调用 process
:
Robot::processFruit(List<Fruit*> basket)
{
foreach(Fruit *fruit, basket)
fruit->process();
}
您在代码示例中所做的 if/else/else 处理正是多态性要避免的事情,而且绝对不是“OOP”方式。
关于c++ - 在 C++ 中使用多态和继承来处理一篮子水果的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612920/
在苹果公司上搜索“苹果”一词时,需要做的,要在它们之间进行创建/区分/区分。 vs 苹果(水果) 例如,在存在苹果公司和苹果作为水果的数据集上进行如下查询: GET my_index/_search
我是一名优秀的程序员,十分优秀!