PHP教學-物件導向 Final 類別和方法終止類別的繼承與方法覆寫

繼承為類別層次(class hierarchy)內部帶來了巨大的靈活性,通過覆寫類別或方法,根據呼叫的是哪個範例,呼叫同樣的類別方法可以得到完全不同的結果。

但有時候,我們可能需要類別或方法保持不變。希望類別或方法完成確定不變的功能,擔心覆寫它會破壞這個功能,那麼需要使用 final 關鍵字。

final 關鍵字可以終止類別的繼承,final 類別不能有子類別,final 方法不能被覆寫。

下面定義一個 final 類別:


<?php 

header('Content-type:text/html;charset=utf-8'); 

// 定義 final 類別 

final class Checkout{ 

    // 類別體 



// 下面嘗試產生 Checkout 類別的子類別: 

class IllegalCheckout extends Checkout{ 

    //... 



// 執行程式碼後會報錯 

?> 



如果只在 Checkout 中聲明某個類別方法為 final,而不是整個類別聲明為 final,那麼繼承 Checkout 就不會出現致命錯誤。final 關鍵字應該放在其他修飾詞(protected、static 等)之前,如下:(注意:看程式碼中的文字)


<?php 

header('Content-type:text/html;charset=utf-8'); 

// 定義 final 類別 

class Checkout{ 

    final function totalize(){ 

        // 方法 

    } 



 

// 現在可以繼承 Checkout 類別,但若覆寫 totalize() 方法會引起錯誤: 

class IllegalCheckout extends Checkout{ 

    final function totalize(){ 

        // 覆寫方法 

    } 



// 執行程式碼後會報錯 

?> 

高質量的物件導向程式碼往往強調定義明確的介面,在統一的介面背後,實現方式往往是多種多樣的。不同的類別或類別的組合遵從公共統一的介面,但在不同的環境下可以表現出不同的行為。

而聲明類別或方法為 final,將會減少這種靈活性。因此,在聲明 final 時,我們要仔細考慮,真是不需要被覆寫嗎?如果程式碼已發佈並給客戶使用,那麼修改起來就不方便了,所以慎用 final 關鍵字。

留言

這個網誌中的熱門文章

c語言-關於#define用法

CMD常用網管指令

PHP 與 JavaScript 之間傳值利用 json