溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

OC類的繼承以及類的循環(huán)調(diào)用

發(fā)布時(shí)間:2020-07-07 01:06:44 來(lái)源:網(wǎng)絡(luò) 閱讀:1812 作者:yjf123546 欄目:開(kāi)發(fā)技術(shù)

,

關(guān)于OC實(shí)量的可見(jiàn),實(shí)量的訪問(wèn)權(quán)限有三種:

1),@public           公有的

@public實(shí)量是公共的,即沒(méi)有訪問(wèn)權(quán),在任何文件中都可以訪問(wèn),(訪問(wèn)方式是通過(guò)對(duì)+指向操作符)

 

 

2),@protected    受保護(hù)

@protected實(shí)量有一定的訪問(wèn),只允在本文件及子文件中訪問(wèn),其他文件不可訪問(wèn)

 

 

3),@private         私有的

@private 實(shí),只允在在本文件中訪問(wèn),不可以在子文件以及其他文件中訪問(wèn).


這里可以說(shuō)下私有方法;私有方法即沒(méi)有在.h文件中聲明,之間在.m文件中實(shí)現(xiàn)的方法,它只允許本類調(diào)用,外部無(wú)法訪問(wèn),即使是子類也無(wú)法訪問(wèn) 


,

通常在定義實(shí)例變量的時(shí)候一般都不再聲明變量的訪問(wèn)權(quán)限,OC默認(rèn)的是@protected,因?yàn)?/span>OC面向對(duì)象的三大特性:封裝,,態(tài).如果聲明為public外部就可以訪問(wèn)以及修改會(huì)影響內(nèi)部的一個(gè)實(shí)現(xiàn),暴漏實(shí)現(xiàn)細(xì)節(jié),不能體現(xiàn)OC面向對(duì)象的封裝特性(封裝的思想是藏內(nèi)部的實(shí)現(xiàn)).如果聲明private,文件就不可以訪問(wèn)該實(shí),這樣文件需重新定聲明,這樣違背了OC面向對(duì)象的承特性,(承是指父的所有實(shí)量和方法等子都可以訪問(wèn)使用.

 

當(dāng)定義為protected又需要對(duì)該變量重新賦值時(shí),可以利用設(shè)置器,即setter方法針對(duì)每個(gè)實(shí)例變量設(shè)置一個(gè)方法為它賦值,同時(shí)利用訪問(wèn)器,即getter方法針對(duì)每個(gè)實(shí)例變量設(shè)置一個(gè)方法來(lái)獲取它的值

如:舉個(gè)人這個(gè)類的例子 類名為Person

其實(shí)例變量為:

{

   

    NSString *_name;   //姓名

    NSString *_sex;     //性別

    NSInteger _age;   //年齡

}

 

1,設(shè)置器,getter方法

1)_name賦值

- (void)setName:(NSString*)name;

 

2)_sex賦值

- (void)setSex:(NSString*)sex;

 

3)_age賦值

-(void)setAge:(NSInteger)age;

 

2,訪問(wèn)器 getter方法

1)讀取_name的值

- (NSString *)name;

 

2)讀取_sex的值

- (NSString *)sex;

 

3)讀取_age的值

- (NSInteger)age;

 

,

類的繼承

1,當(dāng)多個(gè)類出現(xiàn)部分相同的實(shí)例變量和方法時(shí)就要考慮用繼承, 繼承時(shí)將多個(gè)類中相同的實(shí)例變量的方法提出來(lái)寫成一個(gè)公共的父類.

子類繼承父類: 會(huì)將父類中除了聲明為@private的實(shí)例變量以及私有方法外,其余內(nèi)容都會(huì)被繼承們所有如果子類中有和父類同樣的內(nèi)容,可以全部刪除.

私有方法 :即沒(méi)在.h文件中聲明,只在,m文件中實(shí)現(xiàn)了該方法,對(duì)于私有方法不允許外部訪問(wèn),只能讓本類調(diào)用訪問(wèn)

 

一個(gè)類繼承另一個(gè)類時(shí)要在.h文件的@interface開(kāi)頭地方把它的父類寫在:號(hào)后面如,一個(gè)學(xué)生類Student繼承了Person

@interface Student:Person

 

2,繼承時(shí)方法存在三種:

1),保留父類對(duì)該方法的實(shí)現(xiàn),(實(shí)現(xiàn)方法不重寫)

2),按子類重寫后的方式來(lái)實(shí)現(xiàn)(實(shí)現(xiàn)方式重寫方法,寫自己的實(shí)現(xiàn)體完全忽略父類的實(shí)現(xiàn))

3),對(duì)于該方法既有父類的方法實(shí)現(xiàn)也有子類對(duì)該方法的實(shí)現(xiàn),在這種情況下我們一般在方法的實(shí)現(xiàn)內(nèi)容里先把調(diào)用父類方法的實(shí)現(xiàn)即用[super (方法)]這個(gè)方法名是就是繼承過(guò)來(lái)的方法名,然后再實(shí)現(xiàn)子類特有的行為

3,這里需要重點(diǎn)說(shuō)一下繼承類時(shí)自定義初始化的實(shí)現(xiàn)方法

首先自定義初始化的方法名必須是init+Whith開(kāi)頭,返回值是(id),”-”號(hào)方法,

當(dāng)子類有獨(dú)有的實(shí)例變量時(shí)如:

 

{

    NSString *_num;

    NSString *_course;

}

 

多了一個(gè)學(xué)號(hào)和,初始化時(shí)子類只對(duì)自己獨(dú)有的實(shí)例變量賦值即可,super調(diào)用父類對(duì)初始化方法的實(shí)現(xiàn),為從父類繼承過(guò)來(lái)的實(shí)例變量賦值,這里的self還是調(diào)用方法時(shí)的值返回給自己,誰(shuí)調(diào)用就返回給誰(shuí),如果賦值不成功即self == nil,這時(shí)子類不在賦值,因?yàn)槿绻割惖膶?shí)例變量賦值失敗了,子類的賦值也就毫無(wú)意義了

-(id)initWithname:(NSString*)name sex:(NSString *)sex age:(NSInteger)age num:(NSString *)numcourse:(NSString *)course

{

   self = [super initWithname:name sex:sexage:age];

      if(self != nil) {

         _course= course;

         _num= num;

      }

   

    return self;

}

 

四,便利構(gòu)造器

我們?cè)趍ain函數(shù)里創(chuàng)建對(duì)象接收消息時(shí)往往在創(chuàng)建對(duì)象時(shí)需要給對(duì)象開(kāi)辟空間和初始化,這樣可能比較麻煩, 我們?cè)诙x類的時(shí)候直接實(shí)現(xiàn)為對(duì)象開(kāi)辟空間,即便利構(gòu)造器

作用:快速創(chuàng)建對(duì)象,內(nèi)部封裝了創(chuàng)建對(duì)象的過(guò)程,

 格式: 1. +號(hào)方法,

      2, 返回值為id類型,

      3, 以類名+With開(kāi)頭,拼接上多個(gè)參數(shù)

還以上述學(xué)生類Student類繼承人類Person為例

1)在.h文件里寫方法的聲明,

在這里該方法為”+”號(hào)方法

+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course;

2)在.m文件里寫方法的實(shí)現(xiàn)

+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course

{

    return [[Studentalloc] initWithname:name sex:sex age:age num:num course:course];

}

 

 

 

 

,

的循環(huán)調(diào)用的有關(guān)問(wèn)題

該問(wèn)題一般用于解決一個(gè)類實(shí)量里需要用到另一個(gè)的所有

例如一個(gè)家庭,有爸爸,媽媽,兒子,三個(gè)類建立每個(gè)都需要另一個(gè)的內(nèi)容如爸爸類實(shí)量有姓名年齡,妻子,兒子里妻子和兒子的型就是妻子和兒子 + * ,這時(shí)要循環(huán)調(diào),在遇到循環(huán)調(diào)時(shí)需要導(dǎo)入文件,但是這里的導(dǎo)入文件不能直接在該類的.h文件用”#import “頭文件”” 導(dǎo)入文件,因?yàn)檫@個(gè)類還沒(méi)有定義,無(wú)法識(shí)別,再使用該類時(shí)不能把它當(dāng)做一個(gè)類而所以在該類的.h文件里使用”@ class + 要調(diào)用的類名”,將要調(diào)用的類聲明為一個(gè)字符串,但是它不具備的類的內(nèi)容 ,所以要在該類的.m文件里用”#import“頭文件””導(dǎo)入頭文件.下面舉個(gè)家庭的例子

 

1)男人類

(.h文件里)

@class Woman;

#import "Child.h"

@interface Man : NSObject

 

{

    NSString*_name;   //姓名

    NSString*_sex;   //性別

    NSInteger_age;   //年齡

    Woman*_wife;   //妻子

}

//設(shè)置妻子

- (void)setWife:(Woman *)wife;

 

//設(shè)置孩子

- (void)setChild:(Child *)baby;

//訪問(wèn)姓名

- (NSString *)name;

//為_(kāi)sex賦值

- (void)setSex:(NSString *)sex;

 

//為_(kāi)age賦值

- (void)setAge:(NSInteger)age;

 

- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age;

//輸出一個(gè)人的信息

- (void)print;

@end

 

 

(.m文件里)

 

#import "Man.h"

#import "Woman.h"

@implementation Man

 

- (void)setWife:(Woman *)wife

{

    _wife =wife;

}

 

- (void)setChild:(Child *)baby

{

    _baby =baby;

}

 

//訪問(wèn)姓名

- (NSString *)name

{

    return_name;

}

 

//為sex賦值

- (void)setSex:(NSString *)sex

{

    _sex =sex;

}

//為age賦值

- (void)setAge:(NSInteger)age

{

    _age =age;

}

 

- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age

{

    _name =name;

    _sex =sex;

    _age =age;

    returnself;  }

 

-(void)print

{

   NSLog(@"I am a man,My name is %@,My wife's name is %@, My baby'sname is %@",_name,[_wife name],[_baby name]);

}

 

其中女人類和孩子類跟男人類相似,只是調(diào)用的類有所不同,這里不再贅述



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI