荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: heiheihei (瓦尔特), 信区: Java
标 题: java手记(11)--上溯造型(upcasting)
发信站: 荔园晨风BBS站 (Wed Nov 28 18:22:06 2001), 转信
java手记(11)--上溯造型(upcasting)
瓦尔特
下面展示了一次典型的上溯造型。
class Upper{
public void f(){System.out.println("Upper.f()");}
}
class Down extends Upper{
public void f(){System.out.println("Down.f()");}
}
class Upcastingtest{
public static void Doit(Upper u){ u.f(); }
public static void main(String[] args) {
Down down=new Down();
Doit(down);
}
}
Doit参数适用于Upper和Upper派生出来的所有对象。这里将Down句柄转换为Upper句柄的
行为就是Upcasting。
结果: C:\myjava>java Upcastingtest
Down.f()
一般来说,会对于上溯造型存在这样的疑问。为什么不把Doit方法的参数简单直观的设
置为Down类型,反而采用不易理解的上溯造型呢?的确,如果在上面的例子中使用上溯
造型,显得笨了一些,但如果Upper的子类多起来了,不采用上溯造型的方法就会使代码
变得十分繁琐。例子:利用前面的类。
class Down1 extends Upper{
public void f(){System.out.println("Down1.f()");}
}
class Down2 extends Upper{
public void f(){System.out.println("Down2.f()");}
}
这里面,Upper又衍生出两个子类Down1、Down2,并且利用override对各个子类中的f方
法进行了处理。如果试图在Upcastingtest中调用三个子类中的f方法,而不采用上溯造
型的话,就必须修改Upcastingtest中Doit方法的实现。
class Upcastingtest{
public static void Doit(Down down){ down.f(); }
public static void Doit(Down1 down){ down.f(); }
public static void Doit(Down2 down){ down.f(); }
public static void main(String[] args) {
Down down=new Down();
Down1 down1=new Down1();
Down2 down2=new Down2();
Doit(down);
Doit(down1);
Doit(down2);
}
}
这样做当然也是允许的,但是每增加一个Upper的子类,或者要添加一个类似Doit的方法
,都需要添加大量的代码,并且如果在某个子类中忘记了对f方法的过载,编译器也不会
提示错误,这样会造成开发管理的困难。如果采用了上溯造型,则可以避免这样的问题
。
瓦尔特学自thinking in java
作者地址: yaoyu@mail.neu.edu.cn
--
世界上没有任何话能说服你,除非它是你心中的那一句。
世界上没有任何人能打动我,除非她是我心中的那一个。
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 202.118.1.82]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店