成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Objective-C之成魔之路【10-繼承性】

郝萌主傾心貢獻(xiàn),尊重作者的勞動(dòng)成果,請(qǐng)勿轉(zhuǎn)載。

師宗網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

如果文章對(duì)您有所幫助,歡迎給作者捐贈(zèng),支持郝萌主,捐贈(zèng)數(shù)額隨意,重在心意^_^ 

我要捐贈(zèng): 點(diǎn)擊捐贈(zèng)

Cocos2d-X×××:點(diǎn)我傳送


繼承性是面向?qū)ο蟮闹匾拍钪唬?子類能夠繼承父類的某些方法和成員變量。 
作用域限定符為private的成員變量是不可以被繼承的。 
子類還可以重寫父類的方法。 

當(dāng)然,這一切要從根類開始:

沒有父類的類,位于類層次結(jié)構(gòu)的最頂層,稱為根(Root)類。

NSObject是層次結(jié)構(gòu)的最頂端(也就是它上面沒有任何類),因此稱為根類。

如果使用術(shù)語(yǔ),可以將類稱為子類和父類。同樣,也可以將類稱為子類和超類。

需要注意的是,要在子類中直接使用實(shí)例變量,必須先在接口部分聲明。

在實(shí)現(xiàn)部分聲明和合成(synthesize)的實(shí)例變量是私有的,子類中并不能夠直接訪問,

需要明確定義或合成取值方法,才能訪問實(shí)例變量的值。


繼承的概念作用于整個(gè)繼承鏈。

一定要理解以下事實(shí):類的每個(gè)實(shí)例都擁有自己的實(shí)例變量,即使這些實(shí)例變量是繼承來(lái)的。


找出正確的方法:

首先,檢查該對(duì)象所屬的類,以查看在該類中是否明確定義了一個(gè)具有指定名稱的方法。

如果有,就使用這個(gè)方法。如果沒有定義,就檢查它的父類。

如果父類中有定義,就使用這個(gè)方法,否者,繼續(xù)找尋。

直到找到根類也沒有發(fā)現(xiàn)任何方法。


通過繼承來(lái)擴(kuò)展:添加新方法

繼承通常用于擴(kuò)展一個(gè)類。


@class指令:

@class XYPoint;

#import "XYPoint.h"


使用@class指令提高了效率,因?yàn)榫幾g器不需要引入和處理整個(gè)XYPoint.h文件(雖然它很?。?/p>

只需要知道XYPoint是一個(gè)類名。

如果需要引用XYPoint類的方法(在實(shí)現(xiàn)部分中),@class指令是不夠的,因?yàn)榫幾g器需要更多的消息。

說的通俗點(diǎn):只引用了類就用@class不然就用#import。

在默認(rèn)情況下,合成的設(shè)值方法只是簡(jiǎn)單地復(fù)制對(duì)象指針,而不是對(duì)象本身。

你可以合成另一種設(shè)值方法,而不是制作對(duì)象的副本。


為了了解繼承性, 我們看看這樣的一個(gè)場(chǎng)景: 
一位剛學(xué)習(xí)面向?qū)ο蟮男〔?,自從?dāng)上了班長(zhǎng),他就有的忙了,因?yàn)殇浫霗n案,需要描述和處理個(gè)人信息,
于是他定義了類Person:
@interface Person: NSObject {
NSString* name;
int age;
NSDate birthDate;
}
-(NSString*) getInfo;
@end

新的?;⊿chool Beauty類:
一周以后, 小菜又遇到了新的需求, 他的幾個(gè)表妹非要把各自學(xué)校的?;ń榻B給我他,煩惱呀!
需要描述和處理?;ㄐ畔ⅲ?于是他又定義了一個(gè)新的類Beauty。 
@interface Beauty: NSObject {
NSString* name;
int age;
NSDate birthDate;
NSString* school;
}
-(NSString*) getInfo;
@end

小結(jié)
Beauty和Person兩個(gè)類的結(jié)構(gòu)太接近了, 
后者只比前者多出一個(gè)屬性school , 卻要重復(fù)定義其它所有的內(nèi)容。

Objective-C提供了解決類似問題的機(jī)制, 那就是類的繼承。 
@interface Beauty: Person {
NSString* school;
}

方法重寫或者說是覆寫方法:

不能通過繼承刪除或減少方法,但可以利用覆寫來(lái)更改繼承方法的定義。

新方法必須具有相同的返回類型,并且參數(shù)的數(shù)目與覆寫的方法相同。

如果在不同的類中有名稱相同的方法,則根據(jù)作為消息的接收者的類選擇正確的方法。


為什么要?jiǎng)?chuàng)建子類?

有如下3個(gè)理由:

1)希望繼承一個(gè)類的方法,也許加入一些新的方法和或?qū)嵗兞俊?/p>

2)希望創(chuàng)建一個(gè)類的特別的版本。

3)希望通過覆寫一個(gè)或多個(gè)方法來(lái)改變類的默認(rèn)行為。


抽象類:

有時(shí),創(chuàng)建類只是為了更容易創(chuàng)建子類。

因此,這些類名為抽象(abstract)類,或等價(jià)地稱為抽象超類(abstract superclasses)。

在該類中定義方法和實(shí)例變量,但不期望任何人從該類創(chuàng)建實(shí)例。


注意:

子類不能繼承父類中作用域限定符為@private的成員變量。 
子類可以重寫父類的方法,及命名與父類同名的成員變量。 

下面再通過一個(gè)矩形類和正方形類的實(shí)例說明方法重寫問題:
Rectangle.h文件:
#import <Foundation/NSObject.h>  @interface Rectangle: NSObject {     int width;     int height; }  -(Rectangle*) initWithWidth: (int) w height: (int) h; -(void) setWidth: (int) w; -(void) setHeight: (int) h; -(void) setWidth: (int) w height: (int) h; -(int) width; -(int) height; -(void) print; @end 
Rectangle.m文件:
#import "Rectangle.h"  @implementation Rectangle  -(Rectangle*) initWithWidth: (int) w height: (int) h {     self = [super init];      if ( self ) {         [self setWidth: w height: h];     }      return self; }  -(void) setWidth: (int) w {     width = w; }  -(void) setHeight: (int) h {     height = h; }  -(void) setWidth: (int) w height: (int) h {     width = w;     height = h; }  -(int) width {     return width; }  -(int) height {     return  height; }  -(void) print {     NSLog(@"width = %i, height = %i", width, height ); } @end 
Square.h文件:
#import "Rectangle.h"  @interface Square: Rectangle -(Square*) initWithSize: (int) s; -(void) setSize: (int) s; -(int) size; @end 
Square.m文件:
#import "Square.h"  @implementation Square -(Square*) initWithSize: (int) s {     self = [super init];      if ( self ) {         [self setSize: s];     }      return self; }  -(void) setSize: (int) s {     width = s;     height = s; }  -(int) size {     return width; }  -(void) setWidth: (int) w {     [self setSize: w]; }  -(void) setHeight: (int) h {     [self setSize: h]; } @end 
調(diào)試用的main函數(shù):
#import <Foundation/Foundation.h> #import "Square.h" #import "Rectangle.h"  int main (int argc, const char * argv[]) {  		Rectangle *rec = [[Rectangle alloc] initWithWidth: 10 height: 20];     Square *sq = [[Square alloc] initWithSize: 15];      NSLog(@"Rectangle: " );     [rec print]; 	 		NSLog(@"Square: " );     [sq print]; 	     [sq setWidth: 20];     NSLog(@"Square after change: " );     [sq print];      [rec release];     [sq release]; 		     return 0; } 
運(yùn)行結(jié)果:
Rectangle:
width = 10, height = 20
Square:
width = 15, height = 15
Square after change:
width = 20, height = 20

分享文章:Objective-C之成魔之路【10-繼承性】
鏈接地址:http://jinyejixie.com/article14/pdccde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)虛擬主機(jī)、ChatGPT建站公司、手機(jī)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
永吉县| 江川县| 含山县| 正定县| 木兰县| 静乐县| 平利县| 东源县| 响水县| 武邑县| 贵定县| 汶上县| 贺兰县| 桑植县| 噶尔县| 永吉县| 太和县| 宣恩县| 桃源县| 岗巴县| 迁安市| 康平县| 安图县| 闸北区| 逊克县| 仁布县| 始兴县| 郴州市| 桦南县| 安平县| 嘉峪关市| 五原县| 翼城县| 专栏| 精河县| 宁强县| 沙坪坝区| 龙川县| 丹寨县| 大悟县| 滦南县|