多重继承和多态之间有什么区别?

6

多重继承和多态之间有什么区别?

在一本书中,我读到了这样一句话:

类级别不支持多重继承。这意味着您不能同时扩展多个类。

这与同一本书中描述的多态概念相矛盾:

多态是从特定基类创建多个对象的过程

现在,如果PHP不允许多重继承,那么如何允许多态?


PHP不允许多态性吗? - SeanJA
因为它是一种弱类型语言。 - SeanJA
那为什么教科书在PHP面向对象编程的书中要解释多态性的概念呢? - OM The Eternity
@SeanJa 虽然这不是严格的多态性,但该技术仍然可以应用。但在弱类型语言中,它被称为鸭子类型。 - Ikke
各位请具体详细地阐述问题。 - OM The Eternity
显示剩余2条评论
3个回答

20

像Ikke所说的,多重继承与多态无关。

如果我可以画一个类图,多重继承看起来像这样:

Base A    Base B
  ^         ^
   \       /
    \     /
     Child

因此,类Child将继承两个类的属性和行为。许多像Java和PHP这样的语言不允许这样做,但Python可以。

多态性是指你可以抽象出一种特殊情况。首先,看一下类图:

     Animal
     ^    ^
    /      \
   /        \
 Cat        Dog

你可以按照以下步骤进行:

// Assuming we have a pack of animals
// This is Java
for (Animal pet : pack)
    pet.speak();

根据实现方式,每个pet会说不同的话。


啊哈,讲解得非常好。以前我有个误解,非常感谢你Xavier... - OM The Eternity
1
在 PHP 中多态的问题在于由于返回类型不受强制(它是一种弱类型语言),无法保证 speak 实际上会返回一个字符串。它可能会返回一个数据库对象。(请参见 https://dev59.com/H3RB5IYBdhLWcg3wAjRH) - SeanJA

3
多重继承意味着一个对象从两个不同的父类继承。一个程序员骑自行车既是程序员又是骑自行车的人。问题在于,如果程序员类定义了它的成员数据favorite_activityhacking,而骑自行车的人也有favorite_activity,但它是riding。如果你问一个程序员骑自行车的人她最喜欢的favorite_activity是什么,正确的答案是什么?
多态处理对象的行为。它允许您告诉一个对象做某事,并且结果取决于对象的类,即使您不知道确切的类是什么。所以你遇到一个人,虽然你不知道他是程序员还是厨师,你告诉她perform_your_job()。如果是程序员,她将编写代码;如果是厨师,她将烹饪一顿饭,但你不必特别告诉她write_code()make_a_meal()

1
你能否详细解释一下多态性?这个概念很有趣,请一定要讲解一下... - OM The Eternity

1

这两者之间几乎没有什么关系。

多重继承是编译时/运行时静态的东西。多态是一种技术,在运行时才决定调用子类型的哪个方法。

PHP不允许多重继承。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接