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是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍...
黎克特制替換原則
黎克特制替換原則更多的說的是子類與父類的關係的一種原則,子類必須實現父類的所有方法,所有能夠放子類的地方一定能夠放父類。但是這裡的話,我們講有的時候在我們的業務中,有的子類肯定是有個性化的特徵的,比如真槍和玩具槍,真槍能射出子彈,但是玩具槍就不能,那麼這個時候,我們或者通過抽象類,通過抽象類是我們可...
黎克特制替換原則
黎克特制替換原則,主要是乙個關於繼承的規範原則,它要求我們在軟體中寫繼承關係時,所有引用父類的地方必須能夠 透 明地使用其子類物件 子類可以實現父類所提供的抽象 方法,但不要去重寫父類已經實現的方法,或者過載父類的 構 造。要維護繼承的傳遞性,當然很多地方為這個原則打了個 比喻為 龍生龍,鳳生鳳,老...