[英]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 ++中描述的多態性是子類型化 ( 此鏈接的Wikipedia文章中三種不同含義的列表中的第三種)。
這也被描述為動態多態(至少在像C ++這樣的靜態類型的語言中),因為重點是您對象的“動態”(運行時)類型與接口的“靜態”編譯時類型不同。
在PHP中討論的是鴨子類型 ,它實質上是參數多態的一種形式。
盡管實現明顯不同,但這大致相當於您從C ++模板中獲得的靜態多態性。
多態是一個非常抽象的概念,特別是與任何特定實現無關的概念。 從這個意義上講,是的,您的代碼使用了多態性。
現在,關於您與C ++的比較,您正在這里比較蘋果和橙子。 以下PHP片段更接近C ++代碼:
function foo(Animal $animal)
{
$animal->speak();
}
另一方面,您還可以調整C ++代碼:
template<typename animal_type>
void foo(animal_type& animal)
{
animal.speak();
}
請注意,我已根據您的版本修復了指針的非慣用用法,但重要的是該函數現在是模板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.