【发布时间】:2010-10-22 14:37:09
【问题描述】:
当我想扩展两个父类时,我遇到了一种情况,但是 php 不允许这样做。
为什么我不能extend 不止一个类,但可以implement 不止一个interface。扩展许多类有什么问题?
在我遇到解析错误之前,这似乎是一件很明显的事情。
这是一个坏习惯吗?如果是这样,有哪些替代方案?
其他语言可以吗?
【问题讨论】:
当我想扩展两个父类时,我遇到了一种情况,但是 php 不允许这样做。
为什么我不能extend 不止一个类,但可以implement 不止一个interface。扩展许多类有什么问题?
在我遇到解析错误之前,这似乎是一件很明显的事情。
这是一个坏习惯吗?如果是这样,有哪些替代方案?
其他语言可以吗?
【问题讨论】:
为什么在一些/大多数编程语言中禁止多重继承与钻石问题http://en.wikipedia.org/wiki/Diamond_problem争论。
简单地说,如果你有一辆可以游泳和驾驶的汽车,因为它继承自车辆和船,在执行移动功能时会发生什么!?
尝试使用接口并遵循策略模式或状态模式。
【讨论】:
您可能正在寻找:Multiple Inheritance in PHP。
这在 Python 中似乎是可能的。
【讨论】:
这是一种不好的做法吗?如果有,有什么替代方案?
除非该语言是专门为它设计的,否则是的。考虑一下,你有两个类,A 和 B。这两个类都提供了一个公共方法foo(),它具有相同的签名(在 PHP 中并不难)。现在,您创建了一个类C,它扩展了A 和B。
现在,您拨打C.foo()。如果没有明确的指示,解释器怎么知道要调用哪个版本的foo()?
【讨论】:
PHP 不支持。然而,它可以使用 runkit、APD 或通过重写 __call 和 __get 来模拟来自多个类的继承。 Symfony(我很少推荐)也为多重继承提供了“sfMixin”或“sfMixer”。
【讨论】:
实现相同方法的单独类并不是反对多重继承的好论据,因为目前可以实现多个接口。你只是不能用相同的方法实现两个接口。引用http://www.php.net/manual/en/language.oop5.interfaces.php:“一个类不能实现两个共享函数名的接口,因为这会导致歧义。”
【讨论】:
我知道这个问题已经有 2 年了,但我只是遇到了同样的问题。我的解决方法是:如果你有一个普通课程和两个摘要,并且想要扩展两者,例如 abstract class AbstractOne 和 abstract class AbstractTwo,你可以说:
abstract class AbstractOne extends AbstractTwo {
}
然后像这样添加到主类中:
class MyMainClass extends AbstractOne {
}
这样,它继承了 AbstractOne 和 AbstractTwo。
【讨论】: