我们可能都知道方法中的输入参数称为前置条件,在里氏替换原则中也有一个契约,就是父类或接口。契约制定了,也就同时制定了前置条件和后置条件,前置条件就是你要让我执行,就必须满足我的条件;后置条件就是我执行完了需要反馈,标准是什么(大家可能对作者的这句话不很理解,其实我和大家刚看的时候都一样不理解啊!)。
那么我们还是通过作者的例子来理解理解吧!呵呵~~(这里我直接用作者的java版代码啦!)
Father类源代码:
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(){
//父类存在的地方,子类就应该能够存在
//Father f = new Father();
Son f =new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
public static void main(String[] args) {
invoker();
}
}
更具里氏替换原则,父类出现的地方子类就可以出现。
public class Client {
public static void invoker(){
//有父类的地方就有子类
//Father f= new Father();
Son f =new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
public static void main(String[] args) {
invoker();
}
}
这两个的运行结果都是一样,通过代码我们了解到父类的方法输入参数是HashMap类型,子类的输入参数是Map类型,可以理解成子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行。