天天看點

黑馬程式員_Objective-C語言_封裝(彙總)

------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方法,設定成員變量值,還可以對一些不合理的指派進行篩選。

作用:為外界提供一個設定成員變量值的方法

命名規範:

  1. 方法名必須以set開頭,一定是一個對象方法
  2. set後面跟上成員變量的名稱,首字母大寫,去掉下劃線的。_name可以用set方法為SetName
  3. 傳回值一定是void,不能有傳回值
  4. 一定要接收一個參數,而且參數類型和成員變量要一緻
  5. 形參名不能和成員變量名一樣(一般成員變量名加_)
  6. 實作中,一定要用形參給執行個體變量指派
  7. 形參名一般是去掉下劃線的執行個體變量名

在@interface中聲明NNString *_name;以下進行設定和擷取變量值。

聲明:-(void)setName:(NNString *)name;//以後對name設定值,用此方法

實作:-(void)setName:(NNString *)name{

             _name=name;//_name成員變量值,name形參名

           }

B get方法(通路器)

作用:為調用者傳回對象内部的成員變量

命名規範:

  1. 一定有傳回值,傳回值的類型和成員變量的類型一緻
  2. 方法名和成員變量名一樣,是去掉下劃線的執行個體變量名
  3. 不需要接收任何參數
  4. 一定是一個對象方法
  5. get方法實作一定是傳回值是執行個體變量名

形式:聲明:-(NSString *)name;//NSString *傳回類型,name方法名

注意:以後擷取name的值,統一使用name的get方法

實作:-(NSString *)name{

               return _name;

          }

3、對象間的關系

A 組合模式

    相同基類類型的對象組合到樹形結構中,成為“部分-整體"的層次結構,對單個對象群組合對象的使用有一緻性。也就是有同一個接口的對象可以進行組合。

優點:

  1. 用戶端可以統一使用組合對象或單個對象,而不組合結構不暴露其内部表示
  2. 可以很容易在組合體内加入具有相同抽象類型的對象,用戶端不用因為加入了新對象而更改代碼

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教育訓練、期待與您交流! -------