面向?qū)ο蟮娜筇卣鳎?br>
1.封裝
2.繼承
3.多態(tài)
封裝
什么是封裝:
-隱藏內(nèi)部實現(xiàn)班利,穩(wěn)定外部接口
-可以看做是包裝
NSLog(@"%@",Hello world);
系統(tǒng)提供了控制臺輸出函數(shù),我們不知道怎么實現(xiàn)一忱,但是可以使用
Student *stu=[[Student alloc] init];
stu.age=-40
age為property 屬性,輸出結(jié)果為18
封裝的實現(xiàn)
-屬性 封裝了實例變量
-方法 封裝了具體的實現(xiàn)代碼
-類 封裝了屬性和方法
繼承
為什么使用繼承
子類可以繼承父類除了 私有的東西和main.m 之外的所有東西
創(chuàng)建一個項目
創(chuàng)建一個父類
在此注意 NSString有*號桐磁,使用copy或者strong類型
其他的基本數(shù)據(jù)類型使用 assign
此處注意士飒,在方法中調(diào)用屬性對象的時候查邢,要使用self來調(diào)用
接下來創(chuàng)建一個子類
在新建的類中寫屬性和子類方法(此類的父類NSObject并無這些屬性和方法)
接下來對創(chuàng)建的方法進行實現(xiàn)
接下來,我們創(chuàng)建一個類酵幕,這個類繼承自我們剛才創(chuàng)建的類
因為我們繼承的父類中已經(jīng)有了打招呼和消費的方法扰藕,因此在子類中便可以不用在聲明
子類可以對父類中已有的方法進行調(diào)用重寫使用父類中的方法
兩者都實現(xiàn)同樣的功能,使用繼承的方式可以減少代碼量芳撒,精簡代碼減少冗余邓深。
繼承的特點
-使用繼承可以實現(xiàn)代碼的復(fù)用減少代碼的冗余
-Objective-C 中的一個類可以繼承另一個類
-被繼承的類稱為父類或超類(基類)
-繼承的類稱為子類或派生類(孩子類)
-子類可以直接擁有父類中所有允許子類繼承的屬性和方法
-子類可以改變父類中已有的方法,執(zhí)行父類性之下的所有類都會有父類型所持有的全部方法
單一繼承性
Objective-C 不支持多重繼承笔刹,因為多重繼承會有成為“致命方塊”的問題芥备。
繼承的語法
@interface 類名:父類名
冒號后的標示符為要繼承的類
-一般情況下,我們繼承的NSObObject類
-可以獲取NSObject類中大量有用的特性
-Objective-C中只允許單一繼承
繼承中的實例變量
-子類可以添加自己的實例變量和方法
繼承中的方法調(diào)用
-調(diào)用子類的方法時舌菜,首先向子類詢問是否能夠調(diào)用該方法萌壳,容易子類有該方法,直接調(diào)用日月。
-如果子類沒有該方法袱瓮,則找父類的類的父類,往上找爱咬,知道找到為止尺借。
-如果沒有找到,程序報錯精拟。
super關(guān)鍵字
-在子類中需要調(diào)用父類的功能褐望,可以借用super關(guān)鍵字
-子類中使用super發(fā)送消息時,實際上是告訴子類調(diào)用父類的方法
-如果父類沒有定義方法串前,則繼續(xù)在繼承鏈上查找瘫里,直到找到為止
-如果查到NSObject為止還是無法吵到,程序會報錯
-重寫方法時會經(jīng)常用到super關(guān)鍵字來調(diào)用父類的方法
description
-子類可以重寫父類的方法荡碾,NSObject有一個方法為descrption
-該方法返回NSString,用于描述該對象
-當使用NSLog(@"%@",對象)時谨读,會默認調(diào)用該類的description方法
-如果沒有重寫該方法,會默認調(diào)用調(diào)用NSObject的該方法坛吁,返回形式<類型:地址>的數(shù)據(jù)
-子類中重寫該方法可以返回自定義對象的信息劳殖。
可以在剛才出創(chuàng)建的項目中試驗
在main.m文件中添加
在類的方法實現(xiàn)文件中
在此可以看到對象描述的數(shù)據(jù)改變了
多態(tài)
概念
-對于不同對象響應(yīng)同一個方法產(chǎn)生不同的結(jié)果
id數(shù)據(jù)類型(動態(tài))
沒有 * 號
-動態(tài)數(shù)據(jù)類型
-可以指向任何類的對象(設(shè)置是nil),而不關(guān)心什么具體類型
-運行時檢查其具體類型
-可以對它發(fā)送任何(存在的)消息
靜態(tài)數(shù)據(jù)類型
類型 * 對象
總是存儲特定的數(shù)據(jù)類型
編譯器在編碼階段進行語法檢查-編譯前便會檢查語法
在此試驗id類型的具體使用
新建一個類拨脉,在類的接口文件中實現(xiàn)屬性和方法的聲明
在此寫一個Teacher類的輸出哆姻,就是方法的實現(xiàn)
再新建一個類,同樣定義屬性和方法
寫類的實現(xiàn)文件代碼
在main文件中出創(chuàng)建和使用對象
可以發(fā)現(xiàn)玫膀,我們使用id類型來創(chuàng)建一個項目,方便我們使用矛缨。
對于不同的對象Dog和Cat我們都是調(diào)用同一個方法animal eat。
多態(tài)的好處
可以簡化編程接口
-允許在多個類中定義同一個消息接口
-可以定義一個通用的調(diào)用方法,以簡化調(diào)用
把不同的子類對象都當做父類來看
-可以屏蔽不同子類對象之間的差異箕昭,寫出通用得的代碼
-做出通用的編程灵妨,以適應(yīng)需求的不斷不斷變化
創(chuàng)建一個項目
在接口文件寫一個屬性
在實現(xiàn)文件文件
再新建一個類,這個類繼承自剛才的的類
在此用同樣方法創(chuàng)建一個貓類
最后在main函數(shù)文件中使用程序
可以看到最后的輸出中落竹,有一次我們調(diào)用父類方法泌霍,和子類的重寫的方法
在此加斷點調(diào)試,可以看到animal的屬性的具體變化
只有屬于父子類型的時候才能使用這種賦值類型(is a 關(guān)系)
description方法
(用來重寫方法)
-子類可以重寫父類的方法述召,NSObject有一個方法為descrption
-該方法返回NSSting,用于描述該對象
-當使用NSLog(@"%@",對象)時朱转,會默認調(diào)用該對象的description方法
-如果我們不重寫此方法會默認調(diào)用NSObject的該方法,返回形式
<類名:地址>的數(shù)據(jù)
子類中重寫該方法可以返回自定義對象信息
里氏替換原則
-繼承必須確是保超類所擁有的性質(zhì)在子類中仍然成立积暖。
-當一個子類的實例應(yīng)該能夠替換任何超類的實例時肋拔,它們之間才具有is-a關(guān)系
-子類總是可以替換父類去做一些事情
++++
在新建一個類
開閉原則(OCP)
在面向?qū)ο笤O(shè)計中“可復(fù)用設(shè)計”的基石,是最重要的原則之一呀酸,其它設(shè)計原則都是實現(xiàn)開閉原則的一種手段。
勃蘭特·梅耶 的《面向?qū)ο筌浖?gòu)造(Object Oriented Software Construction)》中提出開閉原則琼梆,原文:“Software entities should be open for extension,but closed for modification”性誉。翻譯過來就是:“軟件實體應(yīng)當對擴展開放,對修改關(guān)閉”茎杂〈砝溃【譯】軟件系統(tǒng)中包含的各種組件,例如[模塊](Modules)煌往、[類](Classes)以及功能(Functions)等等倾哺,應(yīng)該在不修改現(xiàn)有代碼的基礎(chǔ)上,引入新功能刽脖。
開閉原則中“開”
是指對組件功能的擴展是開放的羞海,是允許對其進行功能擴展的;
開閉原則中“閉”
是指對原有代碼的修改是封閉的曲管,即不應(yīng)該修改原有的代碼却邓。