C#中 父类与子类相互强制转换之实验 [转]

MSDN是很好,不过,有时需要自己动手实践一下,才能更好的理解和记住一些东西。

我看过很多技术文章,结果到用时,仍然是下不了手。似是而非的。

像上次写的“四舍六入五成双/四舍六入五留双/四舍六入五单双”一样,光看MSDN,还是不清楚,直接写一个小例子,就明白了。


这次,搜了一下“基类 派生类 转换”,结果看了,也是不清不楚,不明白。


于是写了一个例子,试一下,就解惑了。不过具体的原理还不清楚,如果有知其所以然的朋友,不吝赐教。


为了让更多和我一样,还在学习过程中的朋友能省时间,在此献丑了,如果你是高手,请指导,不要打击菜鸟的积极性。



代码里有详细的注释,所以就直接上代码了。

using  System;
using  System.Collections;
using  System.Configuration;
using  System.Data;
using  System.Linq;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.HtmlControls;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Xml.Linq;

namespace  WebApplication3
{

    
///   <summary>
    
///  a类故意定义2个field
    
///   </summary>
     public   class  a
    {
        
public   string  itema1 {  get set ; }
        
public   string  itema2 {  get set ; }
        
public   string  PrintItem()
        {
            
return  itema1  +  itema2;
        }
    }
    
///   <summary>
    
///  b类故意定义1个field,加上继承a类的,共3个field
    
///   </summary>
     public   class  b : a
    {
        
public   string  itemb1 {  get set ; }


        
public   string  PrintItemb()
        {
            
return  itema1  +  itema2  +  itemb1;
        }
    }

    
public   class  d : a
    {
        
public   string  itemd1 {  get set ; }


        
public   string  PrintItemd()
        {
            
return  itema1  +  itema2  +  itemd1;
        }
    }
    
public   class  e : b
    {
        
public   string  iteme1 {  get set ; }


        
public   string  PrintIteme()
        {
            
return  itema1  +  itema2  +  itemb1 + iteme1;
        }
    }

    
public   static   class  c
    {
        
public   static  a geta()
        {
           
return  getb();
        }

        
public   static  b getb()
        {
            b cba 
=   new  b() { itemb1  =   " bb1 " , itema1  =   " bba1 " , itema2  =   " bba2 "  };
            
return  cba;
        }
    }

    
public   partial   class  WebForm1 : System.Web.UI.Page
    {
        
protected   void  Page_Load( object  sender, EventArgs e)
        {
            
// 接下来,我们测试一下,将a类和b类实例化,并赋给不同的值。
            a aa  =   new  a() { itema1 = " a1 " ,itema2 = " a2 " };
            b bb 
=   new  b() { itemb1 = " b1 " ,itema1 = " ba1 " ,itema2 = " ba2 " };

            

            a abc 
=  (a)bb; // 将有3个field的bb实例,强制转换为只有2个field的a类的abc实例。
                        
// 测试一下:会不会像实例生活中,a类袋子只能装2个包子,b类袋子可以装3个包子。
                        
// 现将装3个包子的bb袋子,装进只能装2个包子的abc袋子,会不会抛弃掉一个包子。
                        
// 结果证明,不会抛弃,只是在abc袋子中,我们只能取出2个包子,而当我们再将abc袋子,强制转换并装回b类袋子的新实例bbc袋子时,3个包子又回来了。
            
            b bbc
= (b)abc;
           
//  b dbb = (b)aa; // 这里会出错!!提示“无法将类型为“WebApplication3.a”的对象强制转换为类型“WebApplication3.b”
                            
// 像上面的包子的比喻,如果没有首先将b类袋子的3个包子放进a类袋子,而是直接将a类袋子,强制转换为b类袋子,那是不行的。先从b到a再到b,这是可行的。
            Label1.Text =  aa.PrintItem(); 
            Label2.Text 
=  bb.PrintItemb();
            Label3.Text 
=  abc.PrintItem();
            Label4.Text 
=  bbc.PrintItem();
            Label5.Text
=  bbc.PrintItemb();
            Label6.Text 
=  (c.geta()).PrintItem(); // 这样又可以,
            Label7.Text  =  ((b)(c.geta())).PrintItemb(); // 这样也行。总结出来就是:最初的包子是3个,不管是装哪个类,3个包子是“能量守恒”的/“物质不灭”的,
                                                        
// 只是套在不同的类里,就只能按这个类的“规矩”来办,在a类,只能取出2个,在b类可取出3个。前提是:初次实例化时就有3个包子。
           
//  Label8.Text = ((d)(c.geta())).PrintItemd();  // 这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.d”
            
//  Label9.Text = ((e)(c.geta())).PrintIteme(); // 这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.e”。
                                                            
// 注意到这个提示“无法将类型为“WebApplication3.b”,c.geta()返回的仍然是类b。而不是geta()方法定义时的a。

        }
    }
    
/* 运行输出结果为:

a1a2 
ba1ba2b1 
ba1ba2 
ba1ba2 
ba1ba2b1 
bba1bba2 
bba1bba2bb1 

     
     
     
*/


}

转载于:https://www.cnblogs.com/wjy_gy/archive/2009/10/03/1577699.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值