在C#中基类对象转换成派生类对象不成功。我感到很纳闷,我之前一直这样用就可以的,可今天咋就不行了。
类似于下面的代码public Class ClassA
{}public Class ClassB : ClassA
{}ClassA a = new ClassA ();
ClassB b= a as ClassB ;这样转换之后居然为 null ,请问下大家在什么情况下会有这种问题发生,谢谢大家了。。

解决方案 »

  1.   

    ClassA a = new ClassB (); 
    ClassB b= a as ClassB ; 你那个可以转换成功,那么只要抄几句互联网上的概念就可以开发软件了(我说是开发软件,而不仅仅是冒充程序员)。
      

  2.   

    ClassA a = new ClassB (); 
    ClassB b= a as ClassB ; 
    1楼其实就是强制类型转换的问题
      

  3.   

    ClassA a = new ClassA(); 
    ClassB b= a as ClassB ; 
    你想干啥, 这样会乱套的 ,子类和父类内存大小可能不一样,会直接导致错误
      

  4.   


    虽然我可以理解这么说的东西,但是严格说,这个说法是极端错误的,恰好是不懂类型继承的体现。看看代码:ClassA a = new ClassB (); 
    ClassB b= a as ClassB ;
    这里,声明为ClassA类型的变量a,它的实际类型你试试打印一下a.GetType()看看得到什么结果!也就是说,a所引用的对象“既是ClassB也是ClassA”,这就好像“住院部病人1234同时也是病人1234”,或者说“白马也是马”。这才是继承的概念。再来看母子(或者父子)关系,你能说一个儿子同时也是他自己的母亲吗?不能。所以,把母子或者父子关系说成是继承关系,就是在滥用继承这个概念,在设计中就会写出许多诡异的代码而最终搞乱整体设计。
      

  5.   

    不论你是否用继承来描述对象的不同类型,我们可以先抛开类型来看对象。不论你怎样声明,例如:ClassA a;
    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(或者其子类),就无法强制转换赋值了。
      

  6.   


    类似地,我以前推荐过一本关于.net framework中的架构的书。那本书中凡是具体的地方也都还好,但是非常遗憾地,那本书中很少的理论的解释却根本错误了,它竟然把父亲死后儿子继承遗产来比喻为对象类型继承。这就使得它那篇理论所能够达到的结果变成废物了。儿子继承妈妈的东西,这里边恰好没有类型继承的等价关系。
      

  7.   

    当你把继承搞清楚(包括理解接口),这样才能很好地设计出利用多态技术来解耦的分层系统。在了解继承(以及接口)的时候,不要过分纠缠计算机实现细节,不要纠缠于什么内存大小、指针的值,等等纯粹计算机领域概念。当我们设计ATM与银行卡互操作的业务逻辑时,假设有20种ATM和150种银行卡,我们没有必要设计3000种操作蓝图,而可能只需要将ATM抽象为3种、银行卡抽象为2种,对关系解耦,于是只要说出最多6种设计蓝图就能说清楚,而且还可以将蓝图复用到以后的具体类对象中。在系统运行时,某种具体的ATM、某种具体的银行卡则可以多态地被我们的逻辑蓝图执行。