C#中 父類與子類相互強制轉換之實驗

來源:互聯網
上載者:User

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 

     
     
     */

}

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.