什麼是里氏代換原則? (舉例說明)

藏色散人
發布: 2023-04-05 20:30:02
轉載
8376 人瀏覽過

里氏代換原則

里氏替換原則LSP講的是基底類別和子類別的關係。只有當這種關係存在時,里氏代換關係才存在。如果兩個具體的類別A,B之間的關係違反了LSP的設計,(假設是從B到A的繼承關係)那麼根據具體的情況可以在下面的兩種重構方案中選擇一種。

<?php
//举例说明继承的风险,我们需要完成一个两数相减的功能,由类A来负责。
class a{
public $width;
public $height;
public function func1($a, $b){  
        return $a - $b;  
    }
}
$a = new a();
echo $a->func1(100,50);
//运行结果100-50=50
登入後複製

後來,我們需要增加一個新的功能:完成兩數相加,然後再與100求和,由類B來負責。即類別B需要完成兩個功能:

採用類別B繼承類別A程式碼如下:

class b extends a{  
    public function func1($a, $b){  
        return $a + $b;
    }  
      
    public function func2($a, $b){  
        return $this->func1($a, $b) + 100;
    } 
}
$b = new b();
echo $b->func2(100, 50);
登入後複製

假設類別B在給方法命名時無意中重寫了父類別的方法,造成所有運行相減功能的程式碼全部都呼叫了類別B重寫後的方法,造成原本運作正常的功能fun1出現了錯誤(錯誤的原因是減法變成了加法而其他使用者並不知道。別總是想著程式碼是一個人寫的呦!還有大家沒有時間去逐行讀你的程式碼,他們只是按照規則進行應用)。

里氏替換原則通俗的來講就是:子類別可以擴展父類別的功能,但不能改變父類別原有的功能。 它包含以下4層意義:

1、子類別可以實作父類別的抽象方法,但不能覆寫父類別的非抽象方法。

2、子類別中可以增加自己特有的方法。

3、當子類別的方法重載父類別的方法時,方法的前置條件(即方法的形參)要比父類別方法的輸入參數更寬鬆。

4、當子類別的方法實作父類別的抽象方法時,方法的後置條件(即方法的回傳值)比父類別更嚴格。

看起來很不可思議,因為我們會發現在自己程式設計中常常會違反里氏替換原則,程式照樣跑的好好的。所以大家都會產生這樣的疑問,如果我非要不遵循里氏替換原則會有什麼後果?

後果就是:你寫的程式碼出問題的幾率將會大大增加。

以上是什麼是里氏代換原則? (舉例說明)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:hcoder.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板