標籤:interface 標示 程式 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會繼續向繼承鏈的上一級中尋找。
第四章到此結束,除了請求超類響應資訊這一塊難以很好的理解之外,其他的都還可以。從第五章開始,感覺變的不好理解了,有些知識點反覆看了幾遍還是不能很透徹的理解。。哎
Objective-C學習筆記