设计模式七大原则之里氏替换原则
里氏替换原则:所有引用基类的地方,必须能透明的使用其子类的对象。
通俗的理解:子类可以扩展父类的功能,但不能改变父类原有的功能。
代码示例:
1 //电脑 2 public abstract class Computer 3 { 4 public abstract void Use(); 5 } 6 7 /// <summary> 8 /// 笔记本电脑 9 /// </summary> 10 class LaptopCommputer : Computer 11 { 12 public override void Use() 13 { 14 Console.WriteLine("当前正在使用笔记本电脑"); 15 } 16 } 17 18 /// <summary> 19 /// 台式电脑 20 /// </summary> 21 class DesktopComputer : Computer 22 { 23 public override void Use() 24 { 25 Console.WriteLine("当前正在使用台式电脑"); 26 } 27 } 28 class Program 29 { 30 static void Main(string[] args) 31 { 32 //笔记本电脑 33 Computer laptop = new LaptopCommputer(); 34 laptop.Use(); 35 //台式电脑 36 Computer desktopComputer = new DesktopComputer(); 37 desktopComputer.Use(); 38 39 Console.ReadLine(); 40 } 41 }
里氏替换原则表明,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能过使用基类对象。
例如:我喜欢动物,那我一定喜欢狗,以为狗是动物的子类,但是我喜欢狗,不能推断我喜欢任何动物,包括猫,老鼠,虽然它们也是动物。
里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。
在运行里氏替换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现父类,并实现在父类中声明的方法,运行时,子类实例替换父类实例,可以很方便地扩展系统的功能,无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。