主题:[讨论]请教,关于对lsp里氏替换原则的理解。
最近看了一些lsp替换原则的文章,但我对其中这一句话:“子类必须能替换成它们的父类。”中的“替换”一词不是很理解。
我举个例子:银行帐户有普通帐户和vip账户,vip账户继承普通话账户。
vip账户和普通账户都有存款获得利息的行为,但vip的获取利息的实现不一样(即重写了普通账户的该实现),那么用vip替换掉普通账户,这叫满足了lsp原则吗?
我现在有两种理解:
第一种:如果说不满足,是因为vip和普通的获取利息的行为实现都是不一样的啊,替换的话,算出来的利息数目是不一样的。
第二种:如果说满足,使因为都是同样的行为,我举个这种理解下不符合lsp替换原则的例子:
鱼 A是基类,现在有鱼B,鱼C都继承鱼A。鱼B会飞,鱼C不会飞。那我们可能会在鱼A中加一个Fly(),然后鱼B实现飞的行为,鱼C写上空的实现,如果有其他的鱼的话,那就必须要重写Fly()方法,这样其实就违反了lsp原则,可能应该把飞这个行为写为接口,让拥有“飞”这个行为的鱼来实现,不要因为使用继承来牵连其他派生类。
以上时我的理解,我不知道我的这两种理解哪个是对的,或者都不对,因为我还是菜鸟,所以可能一些说法是错的,希望前辈们指点一下新人,多多讲解,3Q~~
我举个例子:银行帐户有普通帐户和vip账户,vip账户继承普通话账户。
vip账户和普通账户都有存款获得利息的行为,但vip的获取利息的实现不一样(即重写了普通账户的该实现),那么用vip替换掉普通账户,这叫满足了lsp原则吗?
我现在有两种理解:
第一种:如果说不满足,是因为vip和普通的获取利息的行为实现都是不一样的啊,替换的话,算出来的利息数目是不一样的。
第二种:如果说满足,使因为都是同样的行为,我举个这种理解下不符合lsp替换原则的例子:
鱼 A是基类,现在有鱼B,鱼C都继承鱼A。鱼B会飞,鱼C不会飞。那我们可能会在鱼A中加一个Fly(),然后鱼B实现飞的行为,鱼C写上空的实现,如果有其他的鱼的话,那就必须要重写Fly()方法,这样其实就违反了lsp原则,可能应该把飞这个行为写为接口,让拥有“飞”这个行为的鱼来实现,不要因为使用继承来牵连其他派生类。
以上时我的理解,我不知道我的这两种理解哪个是对的,或者都不对,因为我还是菜鸟,所以可能一些说法是错的,希望前辈们指点一下新人,多多讲解,3Q~~