開閉原則與黎克特制替換原則

2021-06-29 05:37:06 字數 1851 閱讀 2152

1.開閉原則

是物件導向設計的基本原則之一,是「可復用設計」的基礎,它的主要原則是:對擴充套件開放,對修改關閉;意思就是我們改變乙個軟體時。應該通過擴充套件方式來改變軟體,而不是修改原有的**。

2.黎克特制替換原則

黎克特制替換原則是說,任何基類可以出現的地方,子類一定可以出現(只有當衍生類可以替換基類,軟體單位的功能不受到影響,基類才能真正被復用,衍生類也能夠在基類的基礎上增加新的行為)。

下面我們通過建乙個專案,簡單實現一下,假如乙個學生養了兩隻動物,乙隻狗乙隻貓,需要進行餵食(過程中匯入標頭檔案的操作省略,方法在.h中的宣告也省略,請自行新增)

1.需要建立的類有:

根檢視mainviewcontroller,負責整體的呼叫與測試

繼承自nsobject的類animal和繼承自animal類的子類cat和dog

繼承自nsobject的類student

2.在animal類中實現乙個方法:

-(void)eat

然後在其子類cat和dog中重寫父類方法:

-(void)eat

-(void)eat

當然也要在cat和dog的標頭檔案中引入

-(void

)eat;不然cat和dog例項化的物件無法呼叫此方法

3.如果不使用開閉和黎克特制替換,則要在student類中實現兩個餵養方法(匯入cat和dog的標頭檔案):

-(void)feedcat:(cat*)cat

-(void)feeddog:(dog*)dog

4.現在在mainviewcontroller中的viewdidload中呼叫是這樣的:

student *stu=[[student alloc]init];

dog *dog=[[dog alloc]init];

cat *cat=[[cat alloc]init];

[stu feedcat:cat];

[stu feeddog:dog];

這種基本實現方式是可以的,也能實現,但是如果學生又喂了乙隻烏龜,則又需要在student中新增給烏龜餵食的方法,這種頻繁修改源**的方式不太可取,下面我們用上開閉原則和黎克特制替換原則,重複3和4的步驟;

3.只需要在student類中實現乙個餵養方法(匯入animal的標頭檔案):

-(void)feed:(animal*)animal

4.在mainviewcontroller中的viewdidload中需要這樣呼叫:

student *stu=[[student alloc]init];

animal *acat=[[cat alloc]init];

animal *adog=[[dog alloc]init];

[stu feed:acat];

[stu feed:adog];

這樣即使學生再餵養n只動物,student裡面的**也不需要再去修改(滿足了上面所說的開閉原則),大大減少了工作量,保持了**的完整性;

這兩行

animal *acat=[[cat alloc]init];

animal *adog=[[dog alloc]init];

就是黎克特制替換,其本質就是用子類去例項化父類宣告的物件(即父類的指標指向子類開闢記憶體),然後呼叫子類內部的方法等。

黎克特制替換原則

黎克特制替換原則 黎克特制代換原則 liskov substitution principle lsp 物件導向設計的基本原則之一。黎克特制代換原則中說,任何基類可以出現的地方,子類一定可以出現。lsp是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...

黎克特制替換原則

黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...

黎克特制替換原則

黎克特制替換原則,主要是乙個關於繼承的規範原則,它要求我們在軟體中寫繼承關係時,所有引用父類的地方必須能夠 透 明地使用其子類物件 子類可以實現父類所提供的抽象 方法,但不要去重寫父類已經實現的方法,或者過載父類的 構 造。要維護繼承的傳遞性,當然很多地方為這個原則打了個 比喻為 龍生龍,鳳生鳳,老...