簡體   English   中英

在PHP中不使用父類時,它稱為多態嗎?

[英]Is it called Polymorphism when not using a parent class in PHP?

在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);

當不使用父類時,它仍被稱為多態嗎?

您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM