面向?qū)ο笳Z言的三大特征
- 封裝 (Encapsulation) ;
- 繼承 (Inheritance);
- 多態(tài) (Polymorphism);
封裝、權(quán)限修飾符(@public、@private、@protected)
- 隱藏屬性、方法或者實現(xiàn)細節(jié)的過程稱之為封裝。
- 權(quán)限修飾符用來修飾實例變量,用來控制實例變量的訪問權(quán)限。
- 在語法上,不存在私有方法。但約定:在 .m 文件中實現(xiàn),但在 .h 文件中沒有聲明的方法稱之為私有方法。
#import <Foundation/Foundation.h>
@interface Car : NSObject {
/* 屬性的封裝
* 1.使類的屬性不讓外部直接訪問
*/ 2.外部使用這個類時,不需要關(guān)心這個類具有哪些屬性
//@public 修飾的成員變量,外部可以直接訪問
//不建議直接使用,因為破壞了屬性的封裝性
@public
NSString *_name; //名稱
NSString *_color; //顏色
//@private 是私有屬性,只能在類的內(nèi)部訪問
// 子類不能訪問private修飾的屬性
@private
float width; //車寬
//@protected 受保護的屬性,
//類的內(nèi)部,子類都可以訪問,類的外部不能訪問
@protected //默認(rèn)的修飾
float _capcity; //耗油量
@package //修飾的變量只能在當(dāng)前所在的框架中訪問
}
/*方法的封裝
1.對功能實現(xiàn)的細節(jié)隱藏于封裝
2.保護屬性
*/
- (void)run;
//封裝還可以保護屬性值的有效性
- (void)setCapicity:(float)capicity;
@end
//.m 文件實現(xiàn)中
//調(diào)用方法時可以對屬性值的有效性進行判斷
- (void)setCapicity:(float)capicity{
if (capicity < 0) {
//給出錯誤處理
return 0;
}
_capcity = capicity;
}
繼承
- 子類具有父類的一般特性(包括屬性和行為),以及自身特殊的特性。
- 定義一個通用的類,它有基本的實例變量。子類繼承了該類,就可以擁有這些實例變量。子類也可以定義自己的實例變量。
-
被繼承的類叫超類或父類(
superclass),繼承超類的類叫子類或派生類(subclass)。 - OC中繼承的語法規(guī)則為:
@interface 子類 : 父類 - 子類自動繼承父類的屬性和方法。
- OC語言的類都是單繼承,即一個子類只能有一個父類。(多繼承即一個子類可以有多個父類,它繼承了多個父類的特性)
父類:
@interface ClassA : NSObject
{
int x;
}
- (void) run;
@end
子類:
@interface ClassB : ClassA
- (void) printVar;
@end
方法重寫
- 通過方法重寫,子類可以改變從父類繼承的行為。
- 被重寫的方法定義必須與父類中的方法完全一樣。
- 方法重寫必須滿足兩個條件:
- 必須要有繼承關(guān)系;
- 重寫方法的方法名、參數(shù)列表必須都一致;
例如:重寫 init 初始化方法。
多態(tài)
- 多態(tài)是指同一種類型,具有多種表現(xiàn)形態(tài)。
- 多態(tài)的條件:
- 必須存在繼承關(guān)系。
- 子類重寫父類的方法。
- 父類聲明的變量指向子類對象。
- 多態(tài)能夠使來自不同類的對象定義相同名稱的方法(不同的類可以有相同的方法名)。
- 動態(tài)類型能使程序直到執(zhí)行時才確定對象所屬的類。
- 動態(tài)綁定能使程序直到執(zhí)行時才確定實際要調(diào)用的對象方法。
Objective-C 系統(tǒng)總是跟蹤對象所屬的類。
釋義:先判定對象所屬的類,然后在運行時確定需要動態(tài)調(diào)用的方法,而不是在編譯的時候。
