## 里氏替換原則
### 理解概念
在子類繼承父類時, 子類不能取復寫父類的方法。 舉例說明一下, 對于父類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: 這里說到的子類不能覆蓋父類方法是說不建議這樣做, 并不是這樣做就會發生語法錯誤, 子類完全有覆蓋父類方法的能力, 如果要違背這一原則請務必三思而后行
- 視覺規范
- 色彩
- 文字
- 偏移
- 圖標
- 列表組件
- 表單組件
- 詳情組件
- 其他組件
- 研發規范
- 編碼規范
- 函數式編程
- 純函數
- 柯里化
- 函數組合
- 函子
- 面向對象編程
- 設計原則
- 單一職責原則
- 里氏替換原則
- 依賴倒置原則
- 接口隔離原則
- 開閉原則
- 迪米特原則
- 組合復用原則
- 設計模式
- 創建型模式
- 工廠模式
- 簡單工廠
- 工廠方法
- 抽象工廠
- 單例模式
- 建造者模式
- 原型模式
- 結構型模式
- 適配器模式
- 橋接模式
- 過濾器模式
- 組合模式
- 裝飾器模式
- 外觀模式
- 享元模式
- 代理模式
- 行為型模式
- 責任鏈模式
- 命令模式
- 解釋器模式
- 迭代器模式
- 中介者模式
- 備忘錄模式
- 觀察者模式
- 狀態模式
- 策略模式
- 模板模式
- 訪問者模式
- 組件設計規范
- 組件文檔編寫規范
- 版本管理規范