01).封裝
封裝是將對象的狀態信息隱藏在對象內部,不允許外部程序直接訪問對象內部信息,而是通過該類所提供的方法來實現對內部信息的操作和訪問。簡而言之,信息隱藏,隱藏對象的實現細節,不讓用戶看到,以此來增強安全性和簡化編程,進而達到封裝的目的。
使用者不必瞭解具體的實現細節,而只是要通過外部接口,以特定的訪問權限來使用類的成員。
訪問修飾符:private、protect、public、Internal
private:私有的,不可供外部訪問的信息,只有類本身能存取.系統默認@private
protect:受保護的,類和派生類可以存取.
Internal:只有同一個項目中的類可以存取.
Public:外部可以直接訪問 person->name = @“jack”;
//封裝 (setter和getter)成對出現
- (void)setName:(NSString *)name;//聲明
- (NSString *)name;//聲明
- (void)setName:(NSString *)name //實現
{
_name = name;
}
- (NSString *)name//實現
{
return _name;
}
[p setName:18];//賦值
[p name]; //取值
//只有getter沒有setter,叫做只讀封裝
擴展:如何讓1個方法不被外界訪問,只需要在.m文件中實現這個方法,不需要在頭文件中定義,即只有實現,沒定義.
02).繼承
OC 的繼承具有 單繼承 的特點,每個子類都只能有一個直接父類。然而,他可以有無限多個間接父類。
當子類繼承父類時,子類可以得到父類的:
1.全部成員變量
2.全部方法
03).多態
一種事物的多種形態。不同類的對象可以定義共享相同名稱的方法,這個就是多態的表現形式。
實現多態的條件:
1.必須存在繼承關係
2.子類重寫父類的方法
3.父類聲明的變量指向子類對象
OC指針類型的變量有兩個:編譯時類型和運行時類型。編譯時類型由聲明變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。如果編譯時類型和運行時類型不一致,就可能出現多態。
父類:動物類 HMAnimal.h
#import <Foundation/Foundation.h>
@interface HMAnimal : NSObject
{
//年齡
int _age;
}
//吃
-(void)eat;
//跑
-(void)run;
@end
父類:動物類HMAnimal.m
#import "HMAnimal.h"
@implementation HMAnimal
//吃
-(void)eat{
NSLog(@"動物在吃");
}
//跑
-(void)run{
NSLog(@"動物會跑");
}
@end
子類:狗狗類 HMDog.h
#import "HMAnimal.h"
@interface HMDog : HMAnimal
//dog類已經有了父類的屬性和行爲
//狗特有的行爲
-(void)lookHome;
@end
子類:狗狗類 HMDog.m
#import "HMDog.h"
@implementation HMDog
//重寫父類的方法
-(void)eat{
NSLog(@"狗正在吃芝麻醬和紅糖");
}
-(void)run{
NSLog(@"狗一邊叫,一邊跑");
}
-(void)lookHome{
NSLog(@"狗會看家");
}
@end
運行 main.m
#import <Foundation/Foundation.h>
#import "HMDog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
HMAnimal *ani1 = [HMDog new];//父類指針指向子類對象,這就是多態
[ani1 eat]; //運行結果由實際賦給該變量的對象決定
[ani1 run];
}
return 0;
}
2017-06-20 23:17:15.450844+0800 多態[2295:564455] 狗正在吃芝麻醬和紅糖
2017-06-20 23:17:15.451833+0800 多態[2295:564455] 狗一邊叫,一邊跑