• 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 { getset; }
            
    public string itema2 { getset; }
            
    public string PrintItem()
            {
                
    return itema1 + itema2;
            }
        }
        
    /// <summary>
        
    /// b类故意定义1个field,加上继承a类的,共3个field
        
    /// </summary>
        public class b : a
        {
            
    public string itemb1 { getset; }


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

        
    public class d : a
        {
            
    public string itemd1 { getset; }


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


            
    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 

         
         
         
    */


    }


    http://four-corner.appspot.com/


  • 相关阅读:
    数据持久化
    搜索样式键盘的Return按钮是否可点击
    活动指示器
    在本机上安装zabbix,来监控服务器 二
    在本机上安装zabbix,来监控服务器 一
    关于cacti的相关问题
    xp_cmdshell 的开启和关闭
    写代码创建数据库,设置位置后比对用可视化界面创建数据库的区别
    随机0~N之间的整数
    关于MD5密码破解
  • 原文地址:https://www.cnblogs.com/meta/p/1569066.html
Copyright © 2020-2023  润新知