首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >遗传和多态性之间的主要区别是什么?

遗传和多态性之间的主要区别是什么?
EN

Stack Overflow用户
提问于 2011-06-10 23:00:18
回答 9查看 285.6K关注 0票数 193

在今天的模块开卷考试结束时,我遇到了这个问题,我发现自己迷失了方向。我正在读Head first Java,这两个定义似乎完全相同。我只是想知道我自己的想法的主要区别是什么。我知道有许多类似的问题,但我还没有看到一个明确的答案。

EN

回答 9

Stack Overflow用户

发布于 2011-06-10 23:03:22

主要的区别是多态性是遗传的特定结果。多态性是在运行时根据对象的类型确定要调用的方法。当一个类继承了另一个类并覆盖了一个特定的方法时,就会出现这种情况。然而,在普通的继承树中,您不必覆盖任何方法,因此并不是所有的方法调用都必须是多态的。这有意义吗?这是一个类似的问题,所有的福特汽车都是汽车,但并不是所有的汽车都是福特(尽管不完全是……)。

此外,多态性处理方法调用,而继承也描述数据成员等。

票数 18
EN

Stack Overflow用户

发布于 2011-06-10 23:18:36

在Java中,这两者密切相关。这是因为Java使用了一种称为“动态调度”的方法调用技术。如果我有

public class A {
  public void draw() { ... }
  public void spin() { ... }
}

public class B extends A {
  public void draw() { ... }
  public void bad() { ... }
}

...

A testObject = new B();

testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

然后,我们看到B从A继承了spin。然而,当我们试图操作对象时,就好像它是一个类型A一样,我们仍然得到了B对draw的行为。draw行为是多态的。

在某些语言中,多态性和继承没有那么紧密地联系在一起。例如,在C++中,未声明为虚的函数是继承的,但不会动态分派,因此即使使用继承也不会获得多态行为。

在javascript中,每个函数调用都是动态分派的,这样你就有了弱类型。这意味着您可以有一堆不相关的对象,每个对象都有自己的draw,有一个函数迭代它们并调用该函数,每个对象的行为都很好。您将拥有自己的多态绘图,而不需要继承。

票数 15
EN

Stack Overflow用户

发布于 2012-12-16 08:55:25

多态性:假设你在一家销售钢笔的公司工作。所以你创建了一个非常好的类,叫做" pen“,它处理了你需要知道的关于笔的所有事情。您可以编写各种用于计费、运输、开具发票的类,所有这些都使用Pen类。一天,老板来了,他说:“好消息!公司正在发展,我们现在开始卖书和CD了!”这不是个好消息,因为现在你必须更改每个使用Pen的类,使其也使用Book & CD。但是,如果您最初创建了一个名为"SellableProduct“的接口,并且Pen实现了此接口,会发生什么呢?然后,您可以编写所有的发货、发票等类来使用该接口,而不是Pen。现在,您需要做的就是创建一个名为Book & CompactDisc的新类,该类实现SellableProduct接口。由于多态,所有其他类都可以继续工作,而不需要更改!讲得通?

因此,这意味着使用继承,这是实现多态性的一种方式。

多态可以在一个类/接口中实现,但继承总是在两个或更多个类/接口之间进行。继承总是符合" is -a“关系,而它并不总是符合多态性(它可以符合"is-a”/ "has-a“关系。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6308178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档