ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 里氏替换原则 ### 理解概念 在子类继承父类时, 子类不能取复写父类的方法。 举例说明一下, 对于父类Car来讲, 它提供了一个move方法, 子类BMW继承自Car时可以拓展Car的move方法但不能对其进行覆盖, move方法能被BMW的子类透明的调用。请看demo: ~~~js class Car { move() { console.log('I\'m running'); } }; class BMW extends Car { run() { this.move(); console.log('new method'); } }; const car = new Car(); const bmw = new BMW(); // 父类实例自然能调用move car.move(); // 子类应能透明调用父类方法, 不要让子类自己也实现一个move方法进而覆盖父类同名方法 bmw.move(); bmw.run(); ~~~ 不覆盖父类的同名方法是防止程序出错, 这和作用域里层同名会遮蔽外层同名变量的目的还不太一样, 我们用子类取继承父类多数是出于代码的复用, 如果取覆盖掉就没有这层意思了, 看下面这个例子: ~~~js class Odd { getOdd(n) { return 2 * n + 1; } }; class Sub extends Odd { getOdd(n) { return 2 * n; } calc(n) { return this.getOdd(n) * 2; } }; const sub = new Sub(); sub.calc(5); // 20, 出错了, 期望是22 ~~~ 这个程序的意图是父类提供一个返回奇数的方法, 子类在继承时无意重写了, 导致子类在calc方法中调用getOdd会得到错误的结果, 以至于程序给出错误的结果 PS: 这里说到的子类不能覆盖父类方法是说不建议这样做, 并不是这样做就会发生语法错误, 子类完全有覆盖父类方法的能力, 如果要违背这一原则请务必三思而后行