gpt4 book ai didi

polymorphism - 通过类和方法的多态性不好吗? (2)

转载 作者:行者123 更新时间:2023-12-05 08:21:30 24 4
gpt4 key购买 nike

我最近读到,通过类和方法实现多态性是实现多态性的一种糟糕方式。为什么这是一个问题,有哪些替代方案?

我知道这是一个有点主观的问题,但从函数式编程的角度来看,这是一个合理的问题,例如: http://blog.thinkrelevance.com/2009/7/8/triadic-programming

如果你是一个靠类的多态性为生的程序员,我不是在攻击你。我只是想了解对方。如果您有这种感觉,请随意解释为什么通过类的多态性比某些替代方案更好。

最佳答案

如果您的层次结构变得太大,多态性(或继承)会导致问题。

例如,具有以下类可能是合乎逻辑的:

class Animal;
class Mammal : public Animal;
class Dog : public Mammal;
class Cat : public Mammal;
class Fish : public Animal;

但是如果在某个时候你需要区分会游泳的动物(狗、鱼)和不会游泳的动物(想象一下猫不会游泳)。那么这样更合乎逻辑:

class Animal;
class SwimmingAnimal: public Animal;
class Dog : public SwimmingAnimal;
class Fish: public SwimmingAnimal;
class NonSwimmingAnimal: public Animal;
class Cat : public NonSwimmingAnimal;

您可以尝试使用虚拟继承来实现两个层次结构,但这很快会导致很多问题(其中之一也称为“菱形继承(钻石问题)”)。

使用接口(interface)可以解决其中的许多问题,但要付出一定的代价。

class Animal;
class Dog : public Animal, public IMammal, public SwimmingAnimal;
class Cat : public Animal, public IMammal;
class Fish: public Animal, public SwimmingAnimal;

由于类仅继承自接口(interface),因此它们不能轻易共享相同的功能。因此共享功能必须通过包含来实现。如果 Dog 和 Fish 想要同时提供“游泳”功能,他们必须提供 swim 方法,并通过将其调用转发到单独的 Swim 类来实现它,就像这样(这都是伪代码):

class Dog : public Animal, public IMammal, public SwimmingAnimal
{
public:
void swim(double speed) {m_swim->swim(speed);}
private:
Swim m_swim;
}

关于polymorphism - 通过类和方法的多态性不好吗? (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2365352/

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