实现阻击手
public class Snipper{
public void killEnemy(AUG _ang){
_ang.zoomOut(); // 先查看情况
// 射击
ang.shoot();
}
}
这就可以啦。在场景中可以杀死敌人
public class Client{
public static void main(String[] args){
Snipper sanMao = new Snipper();
sanMao.setRiffle(new AUG); // 给三毛一只枪
sanMao.killEnemy(); // 进行设计
}
}
这里直接将子类传递进入。
Java中向下转型不安全
public class Client{
public static void main(String[] args){
Snipper sanMao = new Snipper();
sanMao.setRiffle(new AUG); // 给三毛一只枪
sanMao.killEnemy(); // 进行设计
}
}
好吧,在子类出现的地方,父类未必就可以出现。。。向下强制转型,不安全
覆盖或实现父类的方法时输入参数可以被放大
里式替换原则要求定义一个契约,即父类或接口,即契约设计。
// 定义一个转换类
public class Father{
public Collection doSomething(HashMap map){
return map.values();
}
}
这个类完成转换
然后定义子类
public class Son extends Father {
// 将输入放大
public Collection doSomething(Map map){
return map.value();
}
}
然后接着使用
public class Client{
public static void main(String args){
// new 出父类
Father f = new Father();
HashMap map = new HashMap();
f,doSOmething(map);
}
}
在上方中父类被执行
根据里氏替换原则,子类能替代父类
public class Client{
public static void main(String[] args){
SOn f = new Son();
HashMap map = new HashMao();
f.doSomething(map);
}
}
上方的即为里氏替换原则。
子类代替父类传入,子类永远不会被执行。子类要运行,必须重写父类。或者是参数的范围更宽
举例子,如果父类参数条件大,子类参数条件小
public class Father{
public Collection doSomething(Map map){
return map.values();
}
}
public class Son extends Father{
public Collection doSomething(HashMap map){
return map.values();
}
}
接着运行
public class Client{
public static void main(String[] args){
Father f = new Father();
HashMap map = new HashMap();
f.doSomething(map);
}
}
此时可以运行
根据里氏替换原则,子类能使用的地方,父类也能使用。
public class Client{
public static void main(String[] args){
Son f = new Son();
HashMap map = new HashMap();
f.doSomething(map);
}
}
子类被执行,
总结
重载实现父类的时候,输入的参数要求放大
重写,实现父类的时候可以缩小。
www.iming.info
优质内容筛选与推荐>>
1、9.3练习题1 城市轰炸 题解2、[HEOI2016]求和 sum3、2、HTML基础知识4、php session 自定义的设置测试5、wxpython多线程通信的应用-实现边录音边绘制音谱图