定义:子类型必须能替换掉他们的基本类型。只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
    继承无非就是,完全按照父类的方法实现和除了父类的方法再加以扩展新的方法两种类型。那么子类要能替换父类,如何替换,不是说不能扩展新方法,相反,继承就是鼓励子类要扩展新的方法,要不然就违背了继承的意义。只是子类继承父类必须要严格遵守父类的规则。如果子类完全不关心父类制定的规则,就不符合调用者调用父类的本意。不遵循规则,就不能称之为继承。前面讲过开放封闭原则,就是类可以扩展,但是不可修改。那么里氏替换原则正是以这个为基础的。因此继承必须考虑以下几点。
    1、抽象父类很关键。
    不是随便写一个类,就能作为父类用的。必须考虑子类能替换它。比如写一个哺乳动物类。
    public abstract class Mammal      {          public abstract void Viviparous();//胎生          public abstract void ByFoot();//用脚行走      }

    将这个类作为父类放在工程中,每增加一个具体动物类,就新建一个类继承Mammal,看着貌似是符合了开放封闭原则,可是当你增加蝙蝠类和鲸类,ByFoot()方法就有问题了,一个是飞的,一个是游的。怎么办?在父类增加一个方法吗?这明显违背了开放封闭原则。
    有了这个教训,现在再考率抽象Mammal类,

    public abstract class Mammal      {          public abstract void Viviparous();//胎生      }

    只有这一个行为。行走那个方法呢,那么新增具体动物类时,在具体类里自己定义符合自己要求的方法。这样一来,无论你增加什么哺乳动物,这个父类都能满足。凡是用到Mammal类的地方,其子类都能代替它。
    2、父类的方法都要在子类中实现。
这就不用说了,如果子类没有完全实现父类方法,替换父类也就没什么意义了。
    3、子类可以有自己的属性和方法。
这是体现继承的优势的地方,可以扩展父类。因为按照上述要求抽象的父类,必然是只有公共的本质的属性和行为。试想千万种现实的对象,即使按界门纲目科属种分,某一细类的公共部分也是很少的。所以有很多特有的属性和行为都需要子类自定义来丰富自己。