荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店