------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------
1、封裝
程式進行了封裝可以使代碼變得輕便,也提高了運作效率。
不封裝的缺點:把類暴露在外面,失去了對屬性的管理權。
@interface就好像暴露在外面的時鐘表面,向外界提供接口及戰士,@implementation就好比隐藏在時鐘内部的構造實作,把具體的實作封裝起來。
封裝的原理:執行個體變量預設隻能被目前類的對象方法通路。
使用者隻是關心外部的操作過程,内部如何的實作并不關心。使用者隻需要給設定子彈數gun setBulletCount : -3,至于底部如何實作的對他們沒有關系。
底部封裝的是方法的聲明和實作,使用者看不到的:
//槍類聲明
@interface Gun :NSObject
{
@public
NSString *_size;//槍的型号
int _bulletCount;//槍的子彈數
}
//行為,士兵開火
-(void)shoot;
-(void)setBulletCount:(int)bulletCount;
@end
// 槍類實作
@implementation Gun
- (void)shoot{
//每射擊一次子彈個數減一
if (_bulletCount > 0){
_bulletCount--;
NSLog(@"\n%@ 正在射擊,剩餘子彈:%d",_size, _bulletCount);
}
else{
NSLog(@"\n%@ 沒有子彈數");
}
}
//子彈數的實作
-(void)setBulletCount:(int)bulletCount{
if (_bulletCount > 0){
_bulletCount = bulletCount;
}
else{
_bulletCount = 0;
}
}
@end
能展示給使用者看到的或能設定操作的部分:
int main(int argc, const char *argv[]){
@autoreleasepool{
//建立槍對象
Gun *gun = [Gun new];
/* gun->bulletCount = -3;*///子彈個數成員變量指派
//傳入子彈數
[gun setBulletCount : -3];
//調用發射方法
[gun shoot];
[gun shoot];
}
return 0;
}
2、封裝 的步驟
定義設定執行個體變量(set)和通路執行個體變量(get)
A set方法(設定器)
開發過程中,考慮到安全的要求,不使用之前在變量名前面使用@public等關鍵字,而是使用set方法,設定成員變量值,還可以對一些不合理的指派進行篩選。
作用:為外界提供一個設定成員變量值的方法
命名規範:
- 方法名必須以set開頭,一定是一個對象方法
- set後面跟上成員變量的名稱,首字母大寫,去掉下劃線的。_name可以用set方法為SetName
- 傳回值一定是void,不能有傳回值
- 一定要接收一個參數,而且參數類型和成員變量要一緻
- 形參名不能和成員變量名一樣(一般成員變量名加_)
- 實作中,一定要用形參給執行個體變量指派
- 形參名一般是去掉下劃線的執行個體變量名
在@interface中聲明NNString *_name;以下進行設定和擷取變量值。
聲明:-(void)setName:(NNString *)name;//以後對name設定值,用此方法
實作:-(void)setName:(NNString *)name{
_name=name;//_name成員變量值,name形參名
}
B get方法(通路器)
作用:為調用者傳回對象内部的成員變量
命名規範:
- 一定有傳回值,傳回值的類型和成員變量的類型一緻
- 方法名和成員變量名一樣,是去掉下劃線的執行個體變量名
- 不需要接收任何參數
- 一定是一個對象方法
- get方法實作一定是傳回值是執行個體變量名
形式:聲明:-(NSString *)name;//NSString *傳回類型,name方法名
注意:以後擷取name的值,統一使用name的get方法
實作:-(NSString *)name{
return _name;
}
3、對象間的關系
A 組合模式
相同基類類型的對象組合到樹形結構中,成為“部分-整體"的層次結構,對單個對象群組合對象的使用有一緻性。也就是有同一個接口的對象可以進行組合。
優點:
- 用戶端可以統一使用組合對象或單個對象,而不組合結構不暴露其内部表示
- 可以很容易在組合體内加入具有相同抽象類型的對象,用戶端不用因為加入了新對象而更改代碼
B 依賴關系(重點)
A對象作為B對象的局部變量或方法形參,此時B依賴于A。
[person foodDog:dog],此時dog是形參,是A,person是B。
耦合度:修改一個對象時候,對另外一個對象的影響程度。
低耦合:修改一個對象時對其他對象影響比較小
高内聚:一個對象僅僅做自己相關的事情
面向對象設計原則:單一職責原則
執行個體:女孩給土豪打電話,分析主要對象為女孩,手機
1.對手機類,女孩類聲明
//手機類聲明
@interface Iphone :NSObject
{
NSString *_phoneNum;
}
-(void)setPhoneNum:(NSString *)phoneNum;
//打電話
-(void)callPhone;
@end
//女孩類聲明
@interface Girl :NSObject
//打電話
- (void)callPhoneToHao : (Iphone *) ipone;
@end
2.對手機類,女孩類實作
//手機類實作
@implementation Iphone
- (void)setPhoneNum:(NSString *)phoneNum{
_phoneNum = phoneNum;
}
- (void)callPhone{
NSLog(@"給土豪打電話:%@",_phoneNum);
}
@end
//女孩類實作
@implementation Girl
- (void)callPhoneToHao : (Iphone *)ipone{
[ipone setPhoneNum : @"123456"];
[ipone callPhone];//手機撥号
}
@end
3.主函數調用
int main(int argc, const char *argv[]){
@autoreleasepool{
Iphone *ipone7 = [Iphone new];
Girl *girl = [Girl new];
//女孩打電話,依賴于手機
[girl callPhoneToHao : ipone7];
return 0;
}
C 關聯關系(HasA關系)
當一個對象擁有另外一個對象的時候,B對象為A對象的成員變量時,即A包含B,A與B是關聯關系。
關聯關系是耦合度高于依賴關系。
執行個體:人拿ipad聽音樂
1.人和ipad分别聲明
//人類聲明
@interface Person :NSObject
{
NSString *_PersonName;
//有一個Ipad
Ipad *_ipad;
}
//設定姓名和ipad
-(void)setPersonName : (NSString *)personName;
-(void)setIpad : (Ipad *)ipad;
//聽音樂
-(void)listenMusic;
@end
//ipad類聲明
@interface Ipad :NSObject
{
NSString *_ipadName;
}
//設定ipad名稱
-(void)setIpadName : (NSString *)ipadName;
//聽音樂
-(void)playMusic;
@end
2.人和ipad分别實作
//人類實作
@implementation Person
- (void)setPersonName : (NSString *)personName{
_personName = personName;
}
-(void)setIpad : (Ipad *)ipad{
_ipad = ipad;
}
-(void)listenMusic{
[_ipad playMusic];
}
@end
//ipad類實作
@implementation Ipad
- (void)setIpadName : (NSString *)ipadName{
_ipadName = ipadName;
}
-(void)playMusic{
NSLog(@"正在用%@播放音樂", _ipadName);
}
@end
3.測試調用主函數
int main(int argc, const char *argv[]){
@autoreleasepool{
//ipad指派
IpadName *ipad5 = [IpadName new];
[ipad5 setIpadName:@"setIpadName"];
//人有ipad
Person *person = [Person new];
[person setPersonName:@"張三豐"];
//把ipad5給人
[person setIpad : @"ipad5"];
[person listenMusic];
return 0;
}
4、方法的重載
在一個類中可以定義多個同名的方法,但要求每個方法具有不同參數的類型或參數的個數。
這是在c++,java中有的,在OC中是沒有。
在OC中的重載應該是值參數個數不同,但是傳回類型後面的名字相同;或者是參數個數相同,但是其标簽不同。
例如:-(void) test:(int) num;
-(void) test:(float) num1;//錯誤,與第一個方法重名test:
-(void) test:(int) a andY:(int) y;
-(void) test:(int) a andY:(float) y;錯誤,與第一個方法重名test:andY:
-(void) test:(int) a :(float) y;//正确,名字不同
5、static關鍵字
A 使用static不允許修飾執行個體變量,egstatic int _num;錯誤的,執行個體變量不能聲明為靜态,沒有初始化的靜态變量存在BSS段,已經初始化了的存在資料區
B不能使用static修飾方法
C靜态的全局變量隻能目前檔案中使用
------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------