在 PHP 中不使用父类时是否称为多态性
Is it called Polymorphism when not using a parent class in PHP?
在C++中,如果我想使用多态性,我将创建一个父类,然后从父类派生许多子类,然后我将能够将子类对象的地址分配给父类的指针变量。
例如:假设我有一个名为Animal
的父类,然后我从Animal
中导出了两个子类,分别是Dog
和Cat
,这三个类有一个叫speak()
的方法。
现在我可以创建一个将Animal*
作为参数的函数:
void foo(Animal* animal)
{
animal->speak();
}
并执行以下操作:
Cat *cat = new Cat();
Dog *dog = new Dog();
foo(cat);
foo(dog);
但是在 PHP 中,变量可以是任何类型的,所以即使我没有父类Animal
,只有一个Cat
类和一个Dog
类,我仍然可以执行以下操作:
function foo($animal)
{
$animal->speak();
}
$cat = new Cat();
$dog = new Dog();
foo($cat);
foo($dog);
那么在不使用父类时它仍然称为多态性吗?
你在C++中描述的多态性是子类型(在这个链接的维基百科文章中三个不同含义的列表中第三个(。
这也被描述为(至少在C++这样的静态类型语言中(动态多态性,因为关键是对象的"动态"(运行时(类型与接口的"静态"编译时类型不同。
你在PHP中讨论的是鸭子类型,它本质上是一种参数化多态性。
这大致相当于您从C++中的模板中获得的静态多态性,尽管实现显然非常不同。
多态性是一个非常抽象的概念,特别是独立于任何特定的实现。从这个意义上说,是的,您的代码使用多态性。
现在,关于你与C++的比较,你在这里比较苹果和橙子。下面的 PHP 更接近C++代码:
function foo(Animal $animal)
{
$animal->speak();
}
另一方面,您也可以调整C++代码:
template<typename animal_type>
void foo(animal_type& animal)
{
animal.speak();
}
请注意,我已经修复了您的版本对指针的非惯用用法,但重要的是该函数现在是一个模板。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++多态性:如何测试一个类是否派生自另一个基类
- C++ 多态性:如果派生类中的虚函数在基类中声明了常量,是否需要将其声明为常量
- 在 PHP 中不使用父类时是否称为多态性
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 使用数组对对象的编译时多态性是否可行?
- CRTP 静态多态性:是否可以用模拟替换基类
- 是否可以将多态性类存储在共享内存中
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- c++:多态性+多重继承顺序.继承顺序是否重要
- 是否可以为模板化的基类提供专门的类层次结构,但仍利用它们之间的多态性
- "delete"多态性是否正常工作?
- 重载父函数是否会规避多态性?