A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈东 中级黑马   /  2012-3-20 18:13  /  10827 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈东 于 2012-3-21 17:40 编辑

C#中父类如何强制转换子类,转换时需要注意什么?什么情况下需要父类转换子类的强转?希望举例说明一下,最好通俗一点,{:soso_e110:}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
看你将父类引用到的是父类对象还是子类对象了.
比如Person类是Student的父类
那么可以将p直接强制转换为Student:
Person p=new Student();
Student s=(Student)p;//正确

如果你创建实例的时候没有将父类引用到子类对象,是无法转换的:
Person p=new Person();
Student s=(Student)p;//错误

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐振升 于 2012-3-20 19:18 编辑

你应该是问的父类强制转换成子类吧???怎么可能把子类转换成父类(Person)Student   ???子类应该没办法强制转换成父类。

如果是父类转换子类的话  必须只可能是父类实例指向子类对象的时候子类 即Person p = new Student();  这种情况下可以把P对象强制转换。

你可能会问  这样就是创建的一个student对象 我干嘛不用student去创建? 这时候就是面向对象的编程的理解了。

比如:我的一个方法的参数需要传入一个学生,那么你只能传入一个student ,可是如果我的参数可以传入一个人person  ,那么我传进去一个学生student,或者穿进去一个老师teacher 都可以。

void Sing(Student s){.........}//这样一个方法你只能传进去一个学生对象说明这个学生怎么唱歌。。。如果要想要老师唱歌呢?

void Sing(Person p){.....}//这样的话 我可以传进去一个人学生,老师,工人等等,

你还问什么情况需要我转换

我们假设只有学生可以读书。

那么void Reading(Studeng s){.....}、、你只能给他一个学生的参数,但是我现在手里的参数只有一个人Person p = new Person();可是这个参数我们不能穿进去啊,应为我们只知道他是一个人,而是什么人我们不知道,我们需要这个人是学生的时候才可以使用,那么当p = new Student() 这时候我们明确的知道他是一个人还是一个学生。所以我们就可以把他转换成学生放到参数里面。reading(studeng(p)); 当你明确知道这个父类对象的子类类型,确必须使用这个子类类型的时候,你就可以把他强制转换。

希望我的理解对你有帮助。有不对的地方欢迎指出。

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
徐振升 发表于 2012-3-20 19:01
你应该是问的父类强制转换成子类吧???怎么可能把子类转换成父类(Person)Student   ???子类应该没办法 ...

嗯嗯嗯,写错了,是父类强转子类:L
回复 使用道具 举报
陈东 发表于 2012-3-20 19:15
嗯嗯嗯,写错了,是父类强转子类

上面我又加了一个列子 希望对你有帮助。
回复 使用道具 举报
徐振升 发表于 2012-3-20 19:22
上面我又加了一个列子 希望对你有帮助。

灰常谢谢
回复 使用道具 举报
Father obj=new Son();
这样做就可以了
这样做是多态的一种体现。
如果有很多子类。
son1
son2
son3
等等
这样做可以为工厂模式作铺垫
可以写出很漂亮的代码
如果所有的子类放到一个ArrayList sonList 里边,每一个son都做一些事情
那么做的时候可以采用这种方式
for(int i=0;i<sonList.size();i++){
   Father fff=(Father)sonList.get(i);
   fff.do something
}
这样,写一句话,就可以做很多事情了。do something一定要使Father类里边的,而不同的son  重写不同的do something就可以了。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
A a = new B();
B b = (B)a;
这样不会提示错误!
解释一下:
第一句是父类引用指向子类对象,
而第二句把父类a强制转换成子类,
然后赋给子类b,
就不会报错了

而如果在应用中,真的需要父类向子类转换,那么它只具备父类的属性和方法,而子类在此基础之上又具备的方法和属性,站在父类的角度是看不到的!

这样很容易出现问题,
尽量不要这样应用!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马