- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近读到,通过类和方法实现多态性是实现多态性的一种糟糕方式。为什么这是一个问题,有哪些替代方案?
我知道这是一个有点主观的问题,但从函数式编程的角度来看,这是一个合理的问题,例如: 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!