老师,能解释一下最后两条原则吗
来源:3-10 里氏替换原则coding
jiangkerLove
2019-10-24
在视频大概15.40秒的时候,你把基类的入参换成了Map,然后子类中用重载了HashMap入参,在主程序中为
Child child = new Child();
HashMap hashMap = new HashMap();
child.method(hashMap);
这个时候,子类中有父类继承下来的入参为Map的方法和自己重载的HashMap方法,这时用子类调用的方法为自己HashMap方法,这里并没有什么问题呀,因为执行是先使用满足条件的范围更小的那个方法。然后我想正常使用的时候大多都是向上转型为base之后去执行方法,所以
Base child = new Child();
HashMap hashMap = new HashMap();
child.method(hashMap);
这样执行的方法又是父类中的方法了,因为子类只是重载而不是重写了方法。所以我在思考这条原则的意义在于什么,然后我在想,放大子类入参的范围难道是为了在向上转型之后,可以传入Map调用子类自己的方法吗?但是这样显而易见的是不可行的,因为根本不能传入这样的参数呀。反倒是在这种父类是Map的情况下,如果主程这样更改,
Child child = new Child();
Map hashMap = new HashMap();
child.method(hashMap);
依然执行的会是父类中继承过来的方法,所以我不明白什么里氏替换,不管重载范围增大还是缩小,都是默认执行较小范围的HashMap呀,希望老师能给我讲一下这个原则到底干什么的?
然后对于第四个原则,这不应该是Java的特性吗?因为既然是实现,假设返回值可以比基类的返回值类型大,那么在向上转型之后,实际调用的方法是子类重写的方法,此时返回的对象Object让原本Map对象根本没办法接收,所以不可能增大返回值类型呀,所以这是Java约束怎么又是一个设计原则了?
写回答
1回答
-
geelylucky
2019-10-24
012019-10-24
相似问题