设计模式里氏替换原则继承优缺点子类必须完全实现父类的方法

从头开始自学java

发布时间: 18-01-2510:46

继承优点

代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;

提高代码的重用性;

子类可以形似父类,但又异于父类;

提高代码的可扩展性,实现父类的方法就可以“为所欲为”了;

提高产品或项目的开放性。

继承缺点

继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;

降低代码的灵活性。子类必须拥有父类的属性和方法;

增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果

大片的代码需要重构。

克服继承的缺点——里氏替换原则

从整体上来看,利大于弊。

引入里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则定义一

If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代替成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)

里氏替换原则定义二

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的对象。)

只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。

里氏替换原则为良好的继承定义的规范—— 子类必须完全实现父类的方法

里氏替换原则为良好的继承定义的规范—— 子类必须完全实现父类的方法——枪支的抽象类

里氏替换原则为良好的继承定义的规范—— 子类必须完全实现父类的方法——手枪、步枪、机枪的实现类

里氏替换原则为良好的继承定义的规范—— 子类必须完全实现父类的方法——士兵的实现类

里氏替换原则为良好的继承定义的规范—— 子类必须完全实现父类的方法——场景类

里氏替换原则为良好的继承定义的规范—— 违背子类必须完全实现父类的方法

在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。

里氏替换原则为良好的继承定义的规范—— 违背子类必须完全实现父类的方法——玩具枪

里氏替换原则为良好的继承定义的规范—— 违背子类必须完全实现父类的方法——场景类

业务调用类已经出现了问题,正常的业务逻辑已经不能运行

里氏替换原则为良好的继承定义的规范—— 违背子类必须完全实现父类的方法——解决办法instanceof

在Soldier类中增加instanceof的判断,如果是玩具枪,就不用来杀敌人。这个方法可以解决问题,但在程序中,每增加一个类,所有与这个父类有关系的类都必须修改。

里氏替换原则为良好的继承定义的规范—— 违背子类必须完全实现父类的方法——ToyGun脱离继承,建立一个独立的父类

为了实现代码复用,可以与AbastractGun建立关联委托关系

里氏替换原则为良好的继承定义的规范——子类必须完全实现父类的方法——建议

如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

举报/反馈