什麼是多態性?
多態性是繼資料抽象化和繼承後,物件導向語言的第三個特徵。從字面上理解,多態的意思是“多種形態”,簡單來說,多態是具有表現多種形態的能力的特徵,在OO中是指“語言具有根據對象的類型以不同方式處理之,特別是重載方法和繼承類別這種形式」的能力。多態被認為是物件導向語言的必備特性。
例如:
我們建立一個介面Shape,定義一個空的方法draw(),那麼所有的實作類別都必須實作這個方法,假設Shape 有兩個實作類別:Triangle 和Rectangle,我們雖然無法透過類似這樣的Java 程式碼來詮釋PHP 的多態性:
程式碼如下:
Shape s = new Triangle(); s.draw();
不過PHP5.1 中引入了Type Hinting,可以限制函數(或方法)的參數類型,我們使用這個特性來示範PHP5 的多態性。
參考如下的程式碼:
class TestPolymorphism { public function drawNow(Shape $shape) { $shape->draw(); } }
函數drawNow() 中限制傳入的參數類型必須為Shape 介面派生類別的對象,這裡我們傳遞給drawNow() 的參數可能是Triangle或者Rectangle 的對象,也可能是其它的Shape 接口的派生類對象,比如Circle 等等,簡單的說drawNow() 的參數類型是無法預知的,$shape->draw() 的行為最終由傳入的參數的具體類型來決定,例如如果傳入Triangle 的對象,那麼就呼叫Triangle 的draw() 方法,如果傳入Rectangle 的對象,就呼叫Rectangle 的draw() 方法。這種在運行時刻根據傳遞的物件參數的類型來決定呼叫哪一個物件的方法的行為就可以稱之為多態。
Shape 也可以是抽象基底類別或是非抽象的基底類,上面的論述都是成立的。差別在於介面僅定義一套實作類別必須遵守的規則,而使用基底類別則可以為衍生類別提供一些預設的行為。
參考程式碼如下:
/** * Shape Interface * * @version 1.0 * @copyright */ interface Shape { public function draw(); } /** * Triangle * * @uses Shape * @version 1.0 * @copyright */ class Triangle implements Shape { public function draw() { print "Triangle::draw()\n"; } } /** * Rectangle * * @uses Shape * @version 1.0 * @copyright */ class Rectangle implements Shape { public function draw() { print "Rectangle::draw()\n"; } } /** * Test Polymorphism * * @version 1.0 * @copyright */ class TestPoly { public function drawNow(Shape $shape) { $shape->draw(); } } $test = new TestPoly(); $test->drawNow(new Triangle()); $test->drawNow(new Rectangle()); /* vim: set expandtab tabstop=4 shiftwidth=4: */
什麼是動態綁定?
HaoHappy 翻譯的PHP5 Object Pattern 第九節中有介紹:
除了限制訪問,訪問方式也決定哪個方法將被子類別呼叫或哪個屬性將被子類別存取。 函數呼叫與函數本身的關聯,以及成員存取與變數記憶體位址間的關係,稱為綁定。
另有的說法:
綁定(binding):將方法的呼叫連到方法本身稱為綁定,當綁定發生在編譯期,被稱為靜態綁定定,而在程式運行的時候根據物件的類型來決定該綁定方法的成為動態綁定。
PHP 是一種動態語言,使用動態綁定。無須考慮採取何種綁定策略,因為一起都是自動的。
以上是php中多態性與動態綁定詳解介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

继承和多态性会影响类的耦合度:继承会增加耦合度,因为派生类依赖于基类。多态性可以降低耦合度,因为对象可以通过虚函数和基类指针以一致的方式响应消息。最佳实践包括谨慎使用继承、定义公共接口、避免向基类添加数据成员,以及通过依赖注入解耦类。实战案例展示了如何使用多态性和依赖注入降低银行账户应用程序中的耦合度。

析构函数在C++多态性中至关重要,它确保派生类对象在销毁时正确清理内存。多态性允许不同类型的对象响应相同方法调用。析构函数在对象销毁时自动调用,释放其内存。派生类析构函数调用基类析构函数,确保释放基类内存。

函数重载可用于实现多态性,即通过基类指针调用派生类方法,编译器根据实际参数类型选择重载版本。示例中,Animal类定义虚拟makeSound()函数,Dog和Cat类重写该函数,通过Animal*指针调用makeSound()时,编译器会基于指向的对象类型调用相应的重写版本,从而实现多态性。

接口:无实现的契约接口在Java中定义了一组方法签名,但不提供任何具体实现。它充当一种契约,强制实现该接口的类实现其指定的方法。接口中的方法是抽象方法,没有方法体。代码示例:publicinterfaceAnimal{voideat();voidsleep();}抽象类:部分实现的蓝图抽象类是一种父类,它提供了一个部分实现,可以被它的子类继承。与接口不同,抽象类可以包含具体的实现和抽象方法。抽象方法是用abstract关键字声明的,并且必须被子类覆盖。代码示例:publicabstractcla

C++多态性的优点和缺点:优点:代码重用性:通用代码可处理不同对象类型。可扩展性:轻松添加新类,无需修改现有代码。灵活性和可维护性:行为与类型分离,提升代码灵活性。缺点:运行时开销:虚函数分派导致开销增加。代码复杂性:多继承层次结构增加复杂性。二进制大小:虚函数使用增加二进制文件大小。实战案例:动物类层次结构中,多态性使不同的动物对象都能通过Animal指针发出声音。

函数重写和继承的多态性是OOP中实现对象灵活调用的两个关键概念:函数重写:派生类重新定义基类中的同名函数,调用时执行派生类中的具体实现。继承的多态性:派生类可以以与基类相同的方式使用,通过基类引用调用方法时,执行派生类中特定于它的实现。

Golang中的多态性如何发挥作用?在Golang中,多态性是通过接口实现的。通过接口可以实现多个不同类型的对象统一使用的能力,这使得我们可以更灵活地编写代码和处理不同类别对象的逻辑。接下来,本文将介绍Golang中多态性的概念和如何使用接口实现多态性,并提供代码示例来说明其作用。多态性的概念可以通俗地理解为“一个面向对象的概念,它允许将子类类型的指针赋值给

多态性是面向对象编程中允许对象以多种形式的存在的概念,使代码更灵活、可扩展和可维护。C++中的多态性利用虚函数和继承,以及纯虚函数和抽象类来实现动态绑定,使我们可以创建根据对象的实际类型更改行为的类层次结构。在实践中,多态性允许我们创建指向不同派生类对象的基类指针,并根据对象的实际类型调用适当的函数。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

禪工作室 13.0.1
強大的PHP整合開發環境