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会继续向继承链的上一级中查找。

    第四章到此结束,除了请求超类响应信息这一块难以很好的理解之外,其他的都还可以。从第五章开始,感觉变的不好理解了,有些知识点反复看了几遍还是不能很透彻的理解。。哎

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