您的位置:首页 > 编程语言 > Java开发

关于java向上转型及其妙用

2015-01-27 00:00 141 查看
摘要: 向上转型 伴随对象的可互换对象 《thinking in java》(第四版)P38

//Sample

class Animal{
public eat(){...};
}
class Cat extends Animal{
eat(){...};
}
class Dog extends Animal{
eat(){...};
}
public Sample{
public static void mian(String args[]){
Animal a = new Dog();
a.eat();
Animal b = new Cat();
b.eat();
}
}

在上述例子中,Cat和Dog都是继承于Animal的子类,在main中看到,Animal a = new Dog(); 实质上,是先创建了一个Dog的对象,然后将其强制地转型成Animal的对象(子类对象转父类对象可以实现)。此时,父类Animal中的eat方法会被同名的子类eat方法覆盖,a.eat()执行的是子类eat方法,这种情况我们称之为向上转型,是多态的一种表现形式,在书本《thinking in java》中称之为伴随多态的可互换对象。

关于向上转型的应用,也可以冲一个简单的例子中得出:

假如你在一个物流运输公司,有个客户要求你为他运输一定数量的产品到某地,使用某种交通工具.那我们假设你的管理程序中有Truck类,Train类,Plane类专门用来实现使用不同交通工具的成本计算,都有方法cost(Double weight,Double space);那么,问题出来了.客户对于运输器种类是可选择的,你是不是要对每种运输器new个实例放到不同的service方法中为客户服务呢?
很明显这么做有很多代码重复,而且效率太低.那么为什么不构造一个运输工具的父类:
public class Conveyance{
protected weight;
protected space;
public abstract Double cost(Double weight,Double space);
}
然后子类Truck,Plane,Train分别实现cost方法
再构造一个工厂类为客户制造子类实例
public class ConveyanceFactory{
public static Conveyance getConveyance(String which){
if(which.equils("Truck")){return new Truck();}
else if(which.equils("Train")){return new Train();}
else if(which.equils("Plane")){return new Plane();}
else{return null;}
}
}
服务程序的方法实现:
public double transportCost(String type,Double weight,Double space){
Conveyance c;Double cost;
c = ConveyanceFactory.getConveyance("type");
cost = c.cost(weight,space);
return cost;
}
看上面服务层的代码多简单,而且在MVC层次结构中方法和类的设计也和面向对象.这就是上塑造型给我们带来的好处咯
这回就方便了,需要Truck的时候,客户只要告诉你他要用卡车运输运多少距离多远.那业务员就在option按扭里面选择”卡车”在文本框里输入重量多少距离多远.veiw层把数据传给controler处理成我们的服务程序需要的数据类型.然后服务程序被controler调用,用transportCost方法计算出成本返回给veiw,显示给业务员,业务员就可以告诉客户需要支付多少钱啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息