里氏替换原则
- 所有引用基类的地方必须能透明地使用其子类的对象,也就是说子类对象可以替换其父类对象,而程序执行效果不变。
- 在继承体系中,子类中可以增加自己特有的方法,也可以实现父类的抽象方法,但是不能重写父类的非抽象方法,否则该继承关系就不是一个正确的继承关系。
- 通俗的说法就是在所有已经使用了基类的地方,一定可以使用子类并且不会引入错误
不好的设计
@interface Car : NSObject
@property(nonatomic,copy)NSString *steeringWheel;
@property(nonatomic,copy)NSString *tyre;
@property(nonatomic,copy)NSString *cover;
- (void)run;
@end
@implementation Car
- (void)run{
NSLog(@"这辆车只能跑100km/小时");
}
@end
@implementation Race
- (void)run{
NSLog(@"赛车能跑200km/小时");
}
@end
- 调用就出现问题了根据里氏替换原则 在使用car类的地方都是可以使用其子类race来替换,但是这样就不对了
- 在需要只能跑100km/小时的地方就变成了200km/小时
Car *car = [[Car alloc]init]
[car run]
Car *race = [[Race alloc]init]
[race run]
- 好的设计就是race重新写另外的一个方法来规避这个run函数的重写。
实际开发
- 虽然在实际开发中我们其实也不会在car使用的地方去替换成子类的race。
- 所以总结一下里氏替换原则,其实就是让我们平时使用继承关系的时候要要注意这个子类替换父类后依旧可以程序运行成功的。里氏替换原则是用来约束继承关系滥用的。
- 在使用继承之前,需要思考和确认该继承关系是否正确,或者当前的继承体系是否还可以支持后续的需求变更,如果无法支持,则需要及时重构,采用更好的设计方式来设计程序。