b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

里氏代换原则_接口隔离原则_java开闭原则(5)

电脑杂谈  发布时间:2016-11-24 18:01:39  来源:网络整理

}

public static void main(String[] args) {

invoker();

}

}

运行结果还是一样,看明白是怎么回事了吗?父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不回被执行。这是正确的,如果你想让子类的方法运行,就必须覆写父类的方法。大家可以这样想,在一个Invoker类中关联了一个父类,调用了一个父类的方法,子类可以覆写这个方法,也可以重载这个方法,前提是要扩大这个前置条件,就是输入参数的类型大于父类的类型覆盖范围。这样说可能比较理难理解,我们再反过来想一下,如果Father类的输入参数类型大于子类的输入参数类型,会出现什么问题呢?会出现父类存在的地方,子类就未必可以存在,因为一旦把子类作为参数传入,调用者就很可能进入子类的方法范畴。我们把上面的例子修改一下,扩大父类的前置条件,源代码如代码清单2-15所示。

代码清单2-15 父类的前置条件较大

1

2

3

4

5

6

7

8

9

10

11

public class Father {

public Collection doSomething(Map map){

System.out.println('Map 转Collection被执行');

return map.values();

}

}

把父类的前置条件修改为Map类型,我们再修改一下子类方法的输入参数,相对父类缩小输入参数的类型范围,也就是缩小前置条件,源代码如代码清单2-16所示。

代码清单2-16 子类的前置条件较小

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Son extends Father {

//缩小输入参数范围

public Collection doSomething(HashMap map){

System.out.println('HashMap转Collection被执行...');

return map.values();

}

}

在父类的前置条件大于子类的前置条件的情况下,业务场景的源代码如代码清单2-17所示。

代码清单2-17 子类的前置条件较小

1

2

3

4

5

6

里氏代换原则_java开闭原则_接口隔离原则

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Client {

public static void invoker(){

//有父类的地方就有子类

Father f= new Father();

HashMap map = new HashMap();

f.doSomething(map);

}

public static void main(String[] args) {

invoker();

}

}

代码运行结果如下所示:

父类被执行...

那我们再把里氏替换原则引入进来会有什么问题?有父类的地方子类就可以使用,好,我们把这个Client类修改一下,源代码如代码清单2-18所示。

代码清单2-18 采用里氏替换原则后的业务场景类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Client {

public static void invoker(){

//有父类的地方就有子类

Son f =new Son();

HashMap map = new HashMap();

f.doSomething(map);


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-21726-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...