子类可以替换父类的位置.并且程序的功能不受影响(当一个父类指针指向一个子类对象的时候,这里就有里氏替换原则)
需求:员工的工资计算,刚开始,我们会新建一个员工类,类中有一个计算工资的方法
class Employee{
func calculateSalary(name:String){
//空函数,什么也不做
}
}
class Manager:Employee{
override func calculateSalary(name:String) {
print("\(name)的工资是1000")
}
}
class Staff:Employee{
override func calculateSalary(name:String) {
print("\(name)的工资是100")
}
}
let manager : Employee = Manager()
manager.calculateSalary(name: "经理") //经理的工资是1000
let staff : Employee = Staff()
staff.calculateSalary(name: "职员") //职员的工资是100
由于重写了父类Employee的calculateSalary方法,造成计算薪资的方法都是调用子类Manager重写后的方法。如果应用场景是要求公司的薪资都是统一的,那么调用Manager类重写的方法就是不正确的。如果非要重写父类里面的方法,比较通用的做法是:原来的父类和子类都继承一个更通用的基类,原有的继承关系去掉,采用依赖、聚合、组合等关系代替。