引言
我觉得编码是有灵魂的,就像每个人都有信仰一样。那么如何去体现信仰,如何凸显灵魂就需要依赖它所固有的原则。最近学习了设计模式的六大原则,有所感悟,特此做总结和记录。在本文中详细介绍了里氏替换原则(LSP)的定义和理解,同时对它定义的规范进行了举例说明。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:http://blog.youkuaiyun.com/u012403290
技术点
1、前置条件(Pre-condition):
通俗来说就是方法的入参,比如说method(int a),那么这个int a就是前置条件。
2、后置条件(Post-Condition):
通俗来说就是方法的返回,比如说int methd(),那么这个int 就是后置条件。
3、里氏替换原则(LSP):
官方定义如下:
如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
其实是不太好理解的,通俗来说就是说判断某个继承是否符合LSP规则,需要保证它的子类没有改变父类本有的方法,子类可以拓展,但是不能改变父类原有功能。子类的能力要大于父类,即父类使用的方法子类都可以使用,任何子类的对象都可以当做父类使用。
我说一下自己的想法,首先原则肯定是要遵循的,但是如果过度的遵循里氏替换原则会导致的问题是当你继承一个类之后,完全不能重写父类的方法,这样对于多态性的体现有显得非常的拮据。所以我觉得子类重写父类代码之后,只要不破坏父类原本方法的思想,我觉得都不算是破坏里氏替换原则。为什么笔者会有如此感悟呢?下面例子中我会介绍。
里氏替换四条准则
1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
首先,如果是抽象方法,在子类继承的时候是强制要实现的,这是多态的一种体现,但是什么叫不能复写父类的抽象方法呢?比如下面的代码:
//父类
package com.brickworkers;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author Brickworker
* Date:2017年4月5日下午2:07:40
* 关于类Base.java的描述:里氏替换原则父类
* Copyright (c) 2017, brcikworker All Rights Reserved.
*/
public abstract class