标签: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会继续向继承链的上一级中查找。
第四章到此结束,除了请求超类响应信息这一块难以很好的理解之外,其他的都还可以。从第五章开始,感觉变的不好理解了,有些知识点反复看了几遍还是不能很透彻的理解。。哎
标签:interface 标示 程序 objective-c
原文地址:http://wenran.blog.51cto.com/9428559/1675803