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 關鍵字。
但有時候,我們可能需要類別或方法保持不變。希望類別或方法完成確定不變的功能,擔心覆寫它會破壞這個功能,那麼需要使用 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 關鍵字。
留言
張貼留言