Objective-C學習筆記

第四章 繼承

 繼承的語法格式:@interface Circle: NSObject。冒號後邊的標示符石需要繼承的類。 OC中不支持多繼承。 

第一個帶有繼承的程序

 @interface Shape : NSObject{

 ShapeColor fillColor; ShapeRect bounds;

 }

 -(void) setFillColor : (ShapeColor)fillColor; 

-(void) setBounds : (ShapeBounds)bounds; 

-(void) draw; 

@end//Shape 

@implementation Shape 

-(void) setFillColor : (ShapeColor)c { 

fillColor = c; }//setFillColor

 -(void) setBounds : (ShapeRect)b {

 bounds = b; }//setBounds 

-(void) draw { }//draw 

@end //Shape 

@interface Circle : Shape 

@end//Circle 

@interface Rectangle : Shape 

@end//Rectangle 

實現部分 

@implementation Rectangle

 -(void)draw { 

NSLog(@“ drawing rect at(%d %d %d %d) in %@“,

 bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor)); 

}//draw 

@end //Rectangle 

@implementation Circle -(void)draw {

 NSLog(@“ drawing circle at(%d %d %d %d) in %@“, 

bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor)); 

}//draw

 @end //Circle 

有關術語

 超類(superclass)是繼承的類。如circle的超類是shape,而shape的超類時NSObject。 

子類(subclass)是執行繼承的類。circle時shape的子類,而shape時NSObject的子類。 

如果想改變方法的實現,需要重寫(override)繼承的方法。 因爲繼承在子類和超類之間建立了一種“is a”(是一個)的關係,所以NSObject的實例變量叫做isa。即rectangle是一個shape,circle是一個shape。(參考網上他人的見解:isa則相當於java中每個對象的class,就像我們平時寫的,XXX.getClass()或XXX.class。OC中的isa指向了其類對象,想一下,我們在java中使用反射時不都是需要取得其類對象嘛!OC也一樣,類對象isa也是用在運行時獲取對象的類信息的。這樣說其實和java中的class概念是一致的。 ) 

使用更具體種類的對象(rectangle和circle)來代替一般類型(shape),這種能力稱爲多態性。 

每個方法調用都獲得了一個名爲self的隱藏參數,它是一個指向接收信息的對象的指針。 重寫是指在類中聲明一個方法,但是讓該方法的實現部分爲空,然後每個子類都可以實現各自的方法,例如在shape類中的draw方法就是一個例子。 

OC提供了一種super作爲關鍵字的方法,讓你即可以重寫方法的實現,又能調用超類中的實現的方式。例如:

 @implementation Circle -(void)setFillColor:(ShapeColor)c { if(c==kRedColor){c = kGreenColor;} [super setFillColor:c]; }@end 

請求超類響應信息[super setFillColor:c]並將顏色放入到實例變量中。

super是OC提供的一種神奇的功能,當向super發送消息時,實際上是在請求OC向該類的超類發送消息。如果超類中沒有,OC會繼續向繼承鏈的上一級中查找。

    第四章到此結束,除了請求超類響應信息這一塊難以很好的理解之外,其他的都還可以。從第五章開始,感覺變的不好理解了,有些知識點反覆看了幾遍還是不能很透徹的理解。。哎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章