gpt4 book ai didi

c++ - 在 C++ 中使用多态和继承来处理一篮子水果的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:33:21 26 4
gpt4 key购买 nike

假设我正在编写一个处理一篮子水果的机器人。橙子需要榨汁,苹果需要切片,香蕉需要去皮。幸运的是,我们的机器人拥有榨汁、切片和去皮所需的精确工具。

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/

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