如何理解里氏替换原则
我简单的给你说一下吧。
首先,这是编译器的要求,如果不这么做,无法通过编译。
其次,面向对象的编程,其中继承有个大原则,任何子类的对象都可以当成父类的对象使用。
版者权归候芝领士回答网代站或原作酸者所有如有父类人类,可以使用一般的枪,有警察类,可以使用任何的枪。
class Person {化现实体并次计别门带集广众委酸。
void shoot(SimpleGun simpleGun);}class Police extends Person {void shoot(Gun gun);}其中SimpleGun extends Gun。
这样的话任何警察类的对象都可以被当做人类来使用。
也就是说警察类既然会使用任何的枪,当然可以使用一般的枪。
Person person = new Police();person.shoot(simpleGun);而如果反过来,普通人可以使用任何抢,警察只能使用一般枪。
class Person {void shoot(Gun gun);}class Police extends Person {动后你代基论,阶油清采。
void shoot(SimpleGun simpleGun);}这样的话就不合理了,既然警察是人类的一个子类,所以警察也是人类,既然是人类就应该能使用人类的方法,也就是使用任何的枪,可以根据上面的定义,反而警察类的能力还变小了。
所以有一个原则,子类的能力必须大于等于父类,即父类可以使用的方法,子类都可以使用。
返回值也是同样的道理。
假设一个父类方法返回一个List,子类返回一个ArrayList,这当然可以。
如果父类方法返回一个ArrayList,子类返回一个List,就说不通了。
这里子类返回值的能力是比父类小的。
还有抛出异常的情况。
任何子类方法可以声明抛出父类方法声明异常的子类。
而不能声明抛出父类没有声明的异常。
这一切都是为了,任何子类的对象都可以当做父类使用。