在C#中基类对象转换成派生类对象不成功。我感到很纳闷,我之前一直这样用就可以的,可今天咋就不行了。
类似于下面的代码public Class ClassA
{}public Class ClassB : ClassA
{}ClassA a = new ClassA ();
ClassB b= a as ClassB ;这样转换之后居然为 null ,请问下大家在什么情况下会有这种问题发生,谢谢大家了。。
类似于下面的代码public Class ClassA
{}public Class ClassB : ClassA
{}ClassA a = new ClassA ();
ClassB b= a as ClassB ;这样转换之后居然为 null ,请问下大家在什么情况下会有这种问题发生,谢谢大家了。。
ClassB b= a as ClassB ; 你那个可以转换成功,那么只要抄几句互联网上的概念就可以开发软件了(我说是开发软件,而不仅仅是冒充程序员)。
ClassB b= a as ClassB ;
1楼其实就是强制类型转换的问题
ClassB b= a as ClassB ;
你想干啥, 这样会乱套的 ,子类和父类内存大小可能不一样,会直接导致错误
虽然我可以理解这么说的东西,但是严格说,这个说法是极端错误的,恰好是不懂类型继承的体现。看看代码:ClassA a = new ClassB ();
ClassB b= a as ClassB ;
这里,声明为ClassA类型的变量a,它的实际类型你试试打印一下a.GetType()看看得到什么结果!也就是说,a所引用的对象“既是ClassB也是ClassA”,这就好像“住院部病人1234同时也是病人1234”,或者说“白马也是马”。这才是继承的概念。再来看母子(或者父子)关系,你能说一个儿子同时也是他自己的母亲吗?不能。所以,把母子或者父子关系说成是继承关系,就是在滥用继承这个概念,在设计中就会写出许多诡异的代码而最终搞乱整体设计。
ClassB b;
b=获取b的对象实例();
a=b;这里,a与b是同一个对象个体。也就是说,你说此对象是一个ClassA也可以,是一个ClassB也可以,反正在此只有一个东西,而不是什么母子、父子。以前,一些学c++的学员不知道从c++哪些入门书中学来一种风行的观点,硬说ClassB的对象内部有一个内部的、局部的对象是ClassA的,也就是说ClassB的对象b'内部有一个“指针”指向一个ClassA的对象a'。其实那只是个别编译器的某种实现方法而已(不管此实现是否合适)。真正从面向对象来讲,这里不论a还是b变量都指向同一个对象,尽管a与b变量的声明的类型根本不同。最后,说说为什么可以:b=(ClassB)a;这是因为a所引用的真实的具体对象本来就是ClassB类型的,所以当然可以把a赋值给b。如果a引用的对象不是ClassB(或者其子类),就无法强制转换赋值了。
类似地,我以前推荐过一本关于.net framework中的架构的书。那本书中凡是具体的地方也都还好,但是非常遗憾地,那本书中很少的理论的解释却根本错误了,它竟然把父亲死后儿子继承遗产来比喻为对象类型继承。这就使得它那篇理论所能够达到的结果变成废物了。儿子继承妈妈的东西,这里边恰好没有类型继承的等价关系。