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


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

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

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

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

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

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

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

    [c-sharp] view plaincopy
     
    1. using System;  
    2. using System.Collections;  
    3. using System.Configuration;  
    4. using System.Data;  
    5. using System.Linq;  
    6. using System.Web;  
    7. using System.Web.Security;  
    8. using System.Web.UI;  
    9. using System.Web.UI.HtmlControls;  
    10. using System.Web.UI.WebControls;  
    11. using System.Web.UI.WebControls.WebParts;  
    12. using System.Xml.Linq;  
    13. namespace WebApplication3  
    14. {  
    15.     /// <summary>  
    16.     /// a类故意定义2个field  
    17.     /// </summary>  
    18.     public class a  
    19.     {  
    20.         public string itema1 { getset; }  
    21.         public string itema2 { getset; }  
    22.         public string PrintItem()  
    23.         {  
    24.             return itema1 + itema2;  
    25.         }  
    26.     }  
    27.     /// <summary>  
    28.     /// b类故意定义1个field,加上继承a类的,共3个field  
    29.     /// </summary>  
    30.     public class b : a  
    31.     {  
    32.         public string itemb1 { getset; }  
    33.   
    34.         public string PrintItemb()  
    35.         {  
    36.             return itema1 + itema2 + itemb1;  
    37.         }  
    38.     }  
    39.     public class d : a  
    40.     {  
    41.         public string itemd1 { getset; }  
    42.   
    43.         public string PrintItemd()  
    44.         {  
    45.             return itema1 + itema2 + itemd1;  
    46.         }  
    47.     }  
    48.     public class e : b  
    49.     {  
    50.         public string iteme1 { getset; }  
    51.   
    52.         public string PrintIteme()  
    53.         {  
    54.             return itema1 + itema2 + itemb1+iteme1;  
    55.         }  
    56.     }  
    57.     public static class c  
    58.     {  
    59.         public static a geta()  
    60.         {  
    61.            return getb();  
    62.         }  
    63.         public static b getb()  
    64.         {  
    65.             b cba = new b() { itemb1 = "bb1", itema1 = "bba1", itema2 = "bba2" };  
    66.             return cba;  
    67.         }  
    68.     }  
    69.     public partial class WebForm1 : System.Web.UI.Page  
    70.     {  
    71.         protected void Page_Load(object sender, EventArgs e)  
    72.         {  
    73.             //接下来,我们测试一下,将a类和b类实例化,并赋给不同的值。  
    74.             a aa = new a() { itema1="a1",itema2="a2"};  
    75.             b bb = new b() { itemb1="b1",itema1="ba1",itema2="ba2"};  
    76.               
    77.             a abc = (a)bb;//将有3个field的bb实例,强制转换为只有2个field的a类的abc实例。  
    78.                         //测试一下:会不会像实例生活中,a类袋子只能装2个包子,b类袋子可以装3个包子。  
    79.                         //现将装3个包子的bb袋子,装进只能装2个包子的abc袋子,会不会抛弃掉一个包子。  
    80.                         //结果证明,不会抛弃,只是在abc袋子中,我们只能取出2个包子,而当我们再将abc袋子,强制转换并装回b类袋子的新实例bbc袋子时,3个包子又回来了。  
    81.               
    82.             b bbc=(b)abc;  
    83.            // b dbb = (b)aa;//这里会出错!!提示“无法将类型为“WebApplication3.a”的对象强制转换为类型“WebApplication3.b”  
    84.                             //像上面的包子的比喻,如果没有首先将b类袋子的3个包子放进a类袋子,而是直接将a类袋子,强制转换为b类袋子,那是不行的。先从b到a再到b,这是可行的。  
    85.             Label1.Text= aa.PrintItem();   
    86.             Label2.Text = bb.PrintItemb();  
    87.             Label3.Text = abc.PrintItem();  
    88.             Label4.Text = bbc.PrintItem();  
    89.             Label5.Text= bbc.PrintItemb();  
    90.             Label6.Text = (c.geta()).PrintItem();//这样又可以,  
    91.             Label7.Text = ((b)(c.geta())).PrintItemb();//这样也行。总结出来就是:最初的包子是3个,不管是装哪个类,3个包子是“能量守恒”的/“物质不灭”的,  
    92.                                                         //只是套在不同的类里,就只能按这个类的“规矩”来办,在a类,只能取出2个,在b类可取出3个。前提是:初次实例化时就有3个包子。  
    93.            // Label8.Text = ((d)(c.geta())).PrintItemd(); //这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.d”  
    94.             // Label9.Text = ((e)(c.geta())).PrintIteme();//这里会出错!!提示“无法将类型为“WebApplication3.b”的对象强制转换为类型“WebApplication3.e”。  
    95.                                                             //注意到这个提示“无法将类型为“WebApplication3.b”,c.geta()返回的仍然是类b。而不是geta()方法定义时的a。  
    96.         }  
    97.     }  
    98.     /*运行输出结果为: 
    99. a1a2  
    100. ba1ba2b1  
    101. ba1ba2  
    102. ba1ba2  
    103. ba1ba2b1  
    104. bba1bba2  
    105. bba1bba2bb1  
    106.       
    107.       
    108.      */  
    109.   
    110. }  

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

  • 相关阅读:
    DataGridView在vb.net中的操作技巧
    0、(空字串)、Null、Empty、与Nothing的区别
    System.Timers.Timer与System.Windows.Forms.Timer 区别
    C#判断常见类型格式是否正确的类
    C#对系统注册表操作的类
    Socket基础知识分享
    怎样才能充分利用SQL索引
    通过建立Socket连接来快速判断数据库连接是否正确
    C#中各种数据类型转换的方法的类
    VB.Net C#代码转换工具
  • 原文地址:https://www.cnblogs.com/gc2013/p/3727292.html
Copyright © 2020-2023  润新知