flowerzhouyan 2017-11-15 12:17 采纳率: 0%
浏览 876

设计模式之禅中里氏替换原则代码例子的疑惑,请高手赐教

public class Father {
public Collection doSomething(HashMap map){
System.out.println("父类被执行...");

return map.values();

}
}
public class Son extends Father {
//放大输入参数类型
public Collection doSomething(Map map){
System.out.println("子类被执行...");
return map.values();
}
}
public class Client {
public static void invoker(){
//父类存在的地方,子类就应该能够存在
Son f =new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
public static void main(String[] args) {

invoker();
}
}
为什么说“父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行”?
难道不是子类继承了父类的public Collection doSomething(HashMap map)进而使invoker调用时只能调用到父类的函数,如果是Map map = new Map();
f.doSomething(map);那么就应该可以调用子类的public Collection doSomething(Map map);不然重载就没什么意义了,是不是呢?谢谢!

  • 写回答

1条回答

  • threenewbee 2017-11-15 15:53
    关注
     比如说,公认的mp4是可以听音乐、看视频的。
    现在你要买一个mp4
    某个厂家制造了一种mp4,只能播放mp3,不能看视频。你买了什么感觉?上当了吧。
    反过来,如果厂商卖的mp4,除了听音乐、看视频,还能打游戏。你觉得如何,很值吧。
    
    所以,派生类的能力,应该强于(或者等于)基类的能力。父类方法的输入参数是HashMap类型,那么派生类起码也能认HashMap类型,这样能力相当,如果只能认某些HashMap类型,也就是某个HashMap的子类,那么能力就差了(好比只能播放mp3,不能播放mp4的所谓的mp4)。
    但是它不但所有HashMap类型都认,还能认别的Map类型的派生类,那就是能力更强了。
    
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!