您好,登錄后才能下訂單哦!
郝萌主傾心貢獻,尊重作者的勞動成果,請勿轉載。
如果文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額隨意,重在心意^_^
我要捐贈: 點擊捐贈
Cocos2d-X×××:點我傳送
當然,這一切要從根類開始:
沒有父類的類,位于類層次結構的最頂層,稱為根(Root)類。
NSObject是層次結構的最頂端(也就是它上面沒有任何類),因此稱為根類。
如果使用術語,可以將類稱為子類和父類。同樣,也可以將類稱為子類和超類。
需要注意的是,要在子類中直接使用實例變量,必須先在接口部分聲明。
在實現部分聲明和合成(synthesize)的實例變量是私有的,子類中并不能夠直接訪問,
需要明確定義或合成取值方法,才能訪問實例變量的值。
繼承的概念作用于整個繼承鏈。
一定要理解以下事實:類的每個實例都擁有自己的實例變量,即使這些實例變量是繼承來的。
找出正確的方法:
首先,檢查該對象所屬的類,以查看在該類中是否明確定義了一個具有指定名稱的方法。
如果有,就使用這個方法。如果沒有定義,就檢查它的父類。
如果父類中有定義,就使用這個方法,否者,繼續找尋。
直到找到根類也沒有發現任何方法。
通過繼承來擴展:添加新方法
繼承通常用于擴展一個類。
@class指令:
@class XYPoint;
或
#import "XYPoint.h"
使用@class指令提高了效率,因為編譯器不需要引入和處理整個XYPoint.h文件(雖然它很小),
只需要知道XYPoint是一個類名。
如果需要引用XYPoint類的方法(在實現部分中),@class指令是不夠的,因為編譯器需要更多的消息。
說的通俗點:只引用了類就用@class不然就用#import。
在默認情況下,合成的設值方法只是簡單地復制對象指針,而不是對象本身。
你可以合成另一種設值方法,而不是制作對象的副本。
方法重寫或者說是覆寫方法:
不能通過繼承刪除或減少方法,但可以利用覆寫來更改繼承方法的定義。
新方法必須具有相同的返回類型,并且參數的數目與覆寫的方法相同。
如果在不同的類中有名稱相同的方法,則根據作為消息的接收者的類選擇正確的方法。
為什么要創建子類?
有如下3個理由:
1)希望繼承一個類的方法,也許加入一些新的方法和或實例變量。
2)希望創建一個類的特別的版本。
3)希望通過覆寫一個或多個方法來改變類的默認行為。
抽象類:
有時,創建類只是為了更容易創建子類。
因此,這些類名為抽象(abstract)類,或等價地稱為抽象超類(abstract superclasses)。
在該類中定義方法和實例變量,但不期望任何人從該類創建實例。
注意:
#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
#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
#import "Rectangle.h" @interface Square: Rectangle -(Square*) initWithSize: (int) s; -(void) setSize: (int) s; -(int) size; @end
#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
#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; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。