在学习的上一个小程序中,有几个类的接口和实现都非常的相似,我是通过复制粘贴的方式来编写的。
可以使用继承来减少重复的代码。只有代码少了,bug才无处藏身。
OC是单一继承,可以使用OC的其他特性来达到多继承的效果,这个以后会学到的,不用着急。
有关继承的术语
超类(super class):是被继承的类。
父类(parent class):是超类的另一种叫法。
子类(subclass):是执行继承的类。
孩子类(child class):是子类的另一种叫法。
个人倾向于父类/子类这一组称呼。
重写(override):改变父类已有方法的实现,代码运行时,OC会确保调用的是重写后的方法。
我们将上一个程序使用继承做一个简单的重构。
首先,创建一个父类Shape。
接口文件
@interface Shape : NSObject{
ShapeColor color;
ShapeRect bounds;
}
- (void)setColor:(ShapeColor) color;
- (void)setBounds:(ShapeRect) bounds;
- (void)draw;
- (NSString *)colorName:(ShapeColor) color;
@end
实现文件
@implementation Shape
- (void)setColor:(ShapeColor)c{
color = c;
}
- (void)setBounds:(ShapeRect)b{
bounds = b;
}
- (NSString *)colorName:(ShapeColor) color{
switch (color) {
case kRed:
return @"red";
break;
case kGreen:
return @"green";
break;
case kBlue:
return @"blue";
break;
}
}
- (void)draw{
}
@end
将其他几个类继承Shape类,然后重写draw方法。
修改后的Circle类:
接口文件空空如也,bug无处藏身。
@interface Circle : Shape
@end
在实现文件中重写父类中的draw方法。[super colorName:color]调用父类中的方法,获取颜色名称。Rectangle和Triangle类的修改类似。
@implementation Circle
- (void)draw{
NSLog(@"drawing a circle at (%d %d %d %d) in %@",
bounds.x, bounds.y, bounds.widht, bounds.height, [super colorName:color]);
}
@end
使用继承后,重复的代码减少了,扩展和维护变得更加简单。
继承是实现多态性的重要基础,使用更具体种类的对象(Circle或者Rectangle)来代替一般类型(Shape),这种能力被称为多态性。
面向对象编程中,除了继承,复合也是非常重要的,它是让不同对象协同工作的另一种方式,接下来将学习有关复合的知识。