引用转换
✦ 一个对象的引用可以隐式的转换到其父类的引用(向上转换)。
✦ 想转话到子类的引用则需要显式转换(向下转换)。
✦ 引用转换:创建了一个新的引用,它也指向同一个对象。
向上转换
从子类的引用创建父类的引用
Man man = new Man();
Creature a=man; // This is called Upcast
变量a依然指向同一个Man对象(man也指向它)
Console.WriteLine(a==man); // True
唯一的区别是
a和man虽然指向同一个对象,但a的可视范围更小,
即a只能.Name属性,从a这里是拿不出man的其他属性的。
向上转换的应用情景,具体在于,
你手上有一个被实例化的子类,
你的需求是只要其父类的一部分属性,而子类的属性你是完全不需要的。
虽然这种说法过于抽象,但是到了具体情景会用到的。(具体的大项目)
向下转换
接着上面的来
Man man = new Man();
man.Name = "Mike";
man.OtherFeature = 20;
Creature a=man; // This is called Upcast
Man m=(Man)a; // This is called Downcast
Console.WriteLine(m.OtherFeature); // <No error>
Console.WriteLine(m==a); // True
Console.WriteLine(m==man); //True
输出:
20
True
True
查看局部变量:
是的,
在执行如上图蓝字标识的,
向下转换,
实际上让m指向了man变量,并且可视化范围扩大了。
向上转换是隐式转换,向下转换是显示转换。
什么是隐式转换?什么是显示转换?
一句话:
直接等于的就是隐式转换,需要加括号的是显示转换。
需要加括号的,也称为强制转换。
✦ 向下转换和向上转换一样,只涉及到引用,不涉及底层对象。
打个比方,把蓝字改成
Cat c = (Cat)a;
一定会转换失败,因为Cat下面的属性类型与Man是不一致的。
✦ 需要显示转换,因为可能会失败。(这里的需要,是强制要求的,因为你不写就会报错)
写了,会因为 转换失败而报错。
强制转换这种语法要求,就是为了减少错误而规定的。