今天我们不讲概念,先一起看一段程序。
public class Test{
public static void main(String args[]){
Test test=new Test();
Animal a=new Animal("name");
Cat c=new Cat("catname","name");
Dog d=new Dog("dogname","black");
test.f(a);test.f(c);test.f(d);
}
public void f(Animal a){
System.out.println("name:"+a.name);
if(a instanceof Cat){
Cat cat=(Cat)a;
System.out.println(""+cat.eyescolor+"eyes");
}else if(a instanceof Dog){
Dog dog=(Dog)a;
System.out.println(""+dog.furColor+"fur");
}
}
}
}
这是一段比较简单的代码。对象转型实例。主程序中实例化了一个动物,一个猫一个狗。最妙的地方是f(Animal a)方法封装了cat和dog 的变化。使得客户端可以直接使用以下语句得到各自想要的结果。
test.f(a);test.f(c);test.f(d);
而关键语句if(a instanceof Cat) 就是对象转型的一个具体实例。也就是如果动物a实例化的是一只猫,那么就是猫的属性。也就是一个基类的引用类型变量可以“指向”其子类的对象。
但是但是,这不是我想说的。
看到上面的一段程序 我突然就想到了之前学的设计模式。简单工程中的计算器的例子和这个好像。
public class OperationFactory
{
public static Operation createOperate(string operate)
{
Operation oper=null;
switch(operate){
case"+";
oper=new OperationAdd();
break;
case"-";
oper=new OperationSub();
break;
case"*";
oper=new OperationMul();
break;
case"/";
oper=new OperationDiv();
break;
}
return oper;
}
}
客户端
Operation oper;
oper=OperationFactory.createOperate("+");
oper.NumberA=1;
oper.NumberB=2;
double result=oper.GetResult();
虽然一种是设计模式,一种只是一个用法吧,这种风马牛不相及的比较或许能碰触一些想法。
共同点:都会用一个类来做这个创造实例的过程。
不同点:简单工厂中只是单纯的判断几种不同的情况 即 “如果是“+”,则。。 。“ 而第一个例子的特点就是突出了基类和子类的关系。”如果操作符是加,则。。“
然后我们再来看看 对象转型
通俗的说就是子类的对象可以基类的对象来使用。或基类的对象可以当做子类的对象来使用。当然还会有一些规则。如 基类的引用类型变量可以”指向“其子类的对象。
两个例子的确很像,只是通过这个去调动自己。真正的重点还在思考怎么样去学习。基础的比较,点滴积累。