继承是在两个类之间建立关系的一种方式,它可以避免许多重复的代码。建立类之间的关系也可以通过复合的方式。
1.继承的语法和格式
@interface Circle:NSObject
注意:
- Object-C 不支持多继承
- 多继承的效果,需要使用其他的cocoa特性来实现eg:类别category,协议protocol
头文件:
@interface Shape:NSObject{
int fillColor;
int bounds;
}
-(void) setFillColor:(int)fillColor;
-(void) setBounds:(int)bounds;
-(void) draw;
@end
@interface Circle:Shape
-(void) setFillColor:(int)fillColor;
-(void) setBounds:(int)bounds;
-(void) draw;
@end
@interface Rectangle:Shape
-(void) setFillColor:(int)fillColor;
-(void) setBounds:(int)bounds;
-(void) draw;
@end
实现文件:
@implementation Shape
-(void) setFillColor:(int)color{
fillColor = color;
};
-(void) setBounds:(int)bs{
bounds = bs;
};
-(void) draw{
};
@end
@implementation Circle
-(void) draw{
NSLog(@"drawing a circle at (%d %d)",fillColor,bounds);
};
@end
@implementation Rectangle
-(void) draw{
NSLog(@"drawing a rectangle at (%d %d)",fillColor,bounds);
};
@end
2.相关术语
- 超类 superclass 是继承的类,此处指Shape;
- 父类 parent class 是超类的另一种说法;
- 子类 subclass 是执行继承的类;Circle,Rectangle;
- 孩子类 child class 同子类;
- 如果想改变方法的实现,需要重写override继承的方法;如draw方法就有各自的实现;
3.继承的工作机制
- 方法的调度:先查找对象类文件中的查找,没有找到则会往超类中查找;必要时会在继承链中的每一个类中去执行此操作;
- 实例变量:编译器使用“基地址加偏移”的机制实现变量的寻址,偏移位置是通过硬编码是吸纳。self->isa参数.
4.重写方法
当新类继承父类的时候,可以重写父类已经实现的方法,这样当新类的对象的方法调度机制将会运行新类中重写的方法。
- 不重写方法,方法调度时直接使用父类中的方法实现;
- 重写方法,方法调度时直接使用子类中的方法实现;
- 使用super关键字,这样既可以重写方法,又可以使用父类中的方法实现,调用继承链中最近的一个super的方法,直到找到为止;
@implementation Circle
-(void) setFillColor:(int)color{
int kRed = 100;
int kGreenColor = 200;
if(color == kRed){
color = kGreenColor;
}
[super setFillColor:c];
};
-(void) draw{
NSLog(@"drawing a circle at (%d %d)",fillColor,bounds);
};
@end
网友评论