目前我正在尝试理解 MI 的“邪恶”。我刚刚在 youtube 上观看了一个视频,其中一个 js 家伙反对继承。这是他的例子(我用 C++ 重写了它):
struct Robot
{ void drive(); };
struct MurderRobot : public Robot
{ void kill(); };
struct CleanerRobot : public Robot
{ void clean(); };
struct Animal
{ void poop(); };
struct Dog : public Animal
{ void bark(); };
struct Cat : public Animal
{ void meow(); };
然后他建议了一个新类(class)
MurderRobotDog
,在他看来,这不能通过继承优雅地完成。当然,它不能通过单继承来完成。但我认为用 MI 做这件事没有任何问题。我认为我们可以创建一个基类
BarkingObject
,这将有所有吠叫的东西。然后 Dog 继承自 Animal ,它有共同的 poop() 和 BarkingObject
.当你需要一个杀狗机器人时,它必须从 BarkingObject
继承。和 MurderRobot
.这更有意义。 MurderRobotDog
不能从活的生物继承,因为那样它就会变成活的,这与机器人的定义相矛盾。当然,为此您必须使用被许多人认为是 EVIL 的多重继承。不幸的是,如果没有它,我们似乎无法有效地重用不同的不相关(你不需要 poop() 来调用 bark(),并且机器人案例证实了这个断言)功能。你反对我的建议的理由是什么?
最佳答案
多重继承实现是解决这类问题的一种老式方法。
组合是新的方式。
您定义描述特定行为或一组行为的接口(interface):
struct Murderer
{
virtual ~Murderer() = default;
void kill();
};
struct Pooper
{
virtual ~Pooper() = default;
void poop();
};
实际的事物,例如猫、狗或机器人,会相应地继承(即实现)这些接口(interface)。您使用
dynamic_cast
或类似的运行时技术,在执行适当的操作之前查询对象的接口(interface)。
关于c++ - 在这种特定情况下,多重继承有那么糟糕吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62426944/