在PHP中不使用父类时,它被称为多态吗?

时间:2018-03-12 20:14:08

标签: php c++ polymorphism

在C ++中,如果我想使用多态,我会创建一个父类,然后从父类派生出许多子类,然后我就可以将子类对象的地址分配给一个指针变量父类。

例如:假设我有一个名为Animal的父类,然后我从Animal派生了两个子类,即DogCat,以及三个类有一个名为speak()的方法。

现在我可以创建一个以Animal*为参数的函数:

void foo(Animal* animal)
{
    animal->speak();
}

并执行以下操作:

Cat *cat = new Cat();
Dog *dog = new Dog();
foo(cat);
foo(dog);

但是在PHP中,变量可以是任何类型,所以即使我没有父Animal类,只有CatDog类,我仍然可以做到以下几点:

function foo($animal)
{
    $animal->speak();
}

$cat = new Cat();
$dog = new Dog();
foo($cat);
foo($dog);

当不使用父类时,它仍称为多态吗?

2 个答案:

答案 0 :(得分:1)

您在C ++中描述的多态性是子类型this linked Wikipedia article中三个不同含义列表中的第三个)。

这也被描述(至少在像C ++这样的静态类型语言中)作为动态多态,因为关键是"动态" (运行时)对象的类型不同于"静态"编译时类型的接口。

你在PHP中讨论的是duck typing,它本质上是参数多态的一种形式。

这大致相当于您从C ++中的模板获得的静态多态性,尽管实现方式明显不同。

答案 1 :(得分:0)

多态性是一个非常抽象的概念,特别是独立于任何特定实现。从这个意义上讲,是的,您的代码使用多态。

现在,关于你与C ++的比较,你在这里比较苹果和橘子。下面的PHP更接近于C ++代码:

function foo(Animal $animal)
{
    $animal->speak();
}

另一方面,您也可以调整C ++代码:

template<typename animal_type>
void foo(animal_type& animal)
{
    animal.speak();
}

请注意,我已修复了您的版本对指针的非惯用用法,但重要的是该函数现在是一个模板。