最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)子類與父類的相互轉(zhuǎn)換

 更新時(shí)間:2022年05月21日 09:01:21   作者:不曾設(shè)想的道路  
這篇文章主要介紹了C#實(shí)現(xiàn)子類與父類的相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

子類與父類的相互轉(zhuǎn)換

1.父類不能直接強(qiáng)制轉(zhuǎn)換成子類

2.子類可以強(qiáng)制轉(zhuǎn)換成父類,但是在父類中只能取父類的字段與方法因此在一個(gè)父類對(duì)應(yīng)多個(gè)子類的時(shí)候,不知道具體是哪個(gè)子類的時(shí)候,就可以先聲明一個(gè)父類的類型。(如例1)

3.由1,2知,父類不能直接強(qiáng)制轉(zhuǎn)換成子類,但是可以通過間接的方法進(jìn)行轉(zhuǎn)換,例1中有所體現(xiàn):將子類轉(zhuǎn)換成父類,然后再把父類轉(zhuǎn)換成子類,如例2。

特別說明:雖然可以通過間接方式將父類轉(zhuǎn)成子類,但實(shí)際用處不大,因?yàn)樾枰粋€(gè)臨時(shí)的子類來進(jìn)行轉(zhuǎn)換,因?yàn)槠鋵?shí)可以直接在子類直接轉(zhuǎn)換,所以實(shí)際用處不大。

(下例只適用于從棧制到堆的行為,即裝箱拆箱)

例一

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
namespace testApplication  
{  
 public class Parent  
    {  
        public int a=0;  
    }  
    public class Son:Parent  
    {  
        public int b=0;  
        public int run()  
        {  
            return a + b;  
        }  
    }  
    public class Son2 : Parent  
    {  
        public string c = "Son2";  
        public int run()  
        {  
            return a;  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            //不知道具體是哪個(gè)子類,因此先用父類來聲明  
            List<Parent> sL = new List<Parent>();  
            Son cs1 = new Son(); cs1.b = -1;  
            Son cs2 = new Son(); cs2.b = -2;  
            sL.Add(cs1);  //子類可以強(qiáng)制轉(zhuǎn)換成父類,即裝箱 
            sL.Add(cs2);  
            for (int i = 0; i < 2;i++ )  
            {  
                //這里需要把父類再?gòu)?qiáng)制轉(zhuǎn)換成子類(因?yàn)槭茄b箱而來的父類,可以對(duì)其進(jìn)行拆箱成子類)  
                //取出子類中的字段,即拆箱  
                Console.WriteLine(((Son)sL[i]).b);  
            }  
            Console.ReadLine();  
        }  
    }  
}  

例二

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
namespace testApplication  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Parent pa = new Parent();  
            pa.a=9;  
            //設(shè)置一個(gè)臨時(shí)的子類  
            Son tmpt = new Son();  
            tmpt.a = 9;  
            //進(jìn)行裝箱  
            pa = (Parent)tmpt;  
            //進(jìn)行拆箱  
            Son cson = (Son)pa;  
            Console.WriteLine(cson.a);  
            Console.ReadLine();  
        }  
    }  
    public class Parent  
    {  
        public int a=0;  
    }  
    public class Son:Parent  
    {  
        public int b=0;  
        public int run()  
        {  
            return a + b;  
        }  
    }  
    public class Son2 : Parent  
    {  
        public string c = "Son2";  
        public int run()  
        {  
            return a;  
        }  
    }  
}  

子類父類之間相互轉(zhuǎn)換的問題

為了方便演示,這里一共有兩個(gè)簡(jiǎn)單的類

父類:動(dòng)物類(Animal)

/// <summary>
/// 動(dòng)物類-父類
/// </summary>
public class Animal
{
    /// <summary>
    /// 腳
    /// </summary>
    public string Foot { get; set; }
    /// <summary>
    /// 頭
    /// </summary>
    public string Head { get; set; }
}

子類:狗類(Dog)

/// <summary>
/// 狗類-繼承動(dòng)物類
/// </summary>
public class Dog : Animal
{
    /// <summary>
    /// 尾巴
    /// </summary>
    public string Tail { get; set; }
    /// <summary>
    /// 構(gòu)造函數(shù)
    /// </summary>
    public Dog()
    {
        Head = "狗頭";
        Foot = "狗腿";
        Tail = "狗尾巴";
    }
}

第一步:如果我們將Dog類轉(zhuǎn)換為Animal類

Dog dog = new Dog();
//轉(zhuǎn)換為動(dòng)物類---子類轉(zhuǎn)換為父類
Animal animal = dog as Animal;

這個(gè)按照我們一貫的想法,應(yīng)該就是舍去子類的擴(kuò)展屬性(這里是Tail),只保留父類中的屬性(Foot,Head)。那么結(jié)果轉(zhuǎn)換后的Animal類應(yīng)該這樣的

在這里插入圖片描述

第二步:而如果我們繼續(xù)把這個(gè)對(duì)象重新轉(zhuǎn)換為Dog類 Dog dog2 = animal as Dog; Dog類應(yīng)該是這樣的

在這里插入圖片描述

但是事實(shí)上,在第一步把Dog轉(zhuǎn)換為Animal時(shí),Animal沒有把Tail這個(gè)字段拋去,如下圖

在這里插入圖片描述

但是,在VS的智能提示中我們并不能訪問Tail屬性,直接使用編譯也會(huì)報(bào)錯(cuò)

在這里插入圖片描述

而且從上面的結(jié)果中,我們也能猜出第二步的實(shí)際結(jié)果,Dog類中Tail并不是NULL

在這里插入圖片描述

第三步:試試父類轉(zhuǎn)換為子類

在這里插入圖片描述

很明顯,父類并不能轉(zhuǎn)換成子類,雖然編譯可以通過,但是運(yùn)行時(shí)會(huì)拋出System.InvalidCastException異常,當(dāng)然這里使用as關(guān)鍵詞可以避免這一異常,結(jié)果返回NULL

那么父類怎么轉(zhuǎn)換成子類呢?對(duì)于一些相對(duì)簡(jiǎn)單的類,我們可以通過遍歷的方式逐個(gè)賦值

Animal animal = new Animal
{
    Foot = "腳",
    Head = "頭"
};
Dog dog = new Dog
{
    Foot = animal.Foot,
    Head = animal.Head,
};

如果屬性多的時(shí)候,使用這種方法就麻煩了,這時(shí)可以使用反射遍歷屬性來設(shè)置對(duì)應(yīng)的值

Animal animal = new Animal
{
    Foot = "腳",
    Head = "頭"
};
Dog dog = new Dog();
//遍歷Animal類的公共屬性
foreach (PropertyInfo item in typeof(Animal).GetProperties())
{
    item.SetValue(dog, item.GetValue(animal));
}

結(jié)果:

在這里插入圖片描述

更多有關(guān)反射的內(nèi)容可以參考官方文檔

到這里結(jié)論應(yīng)該清楚了

  • 子類可以轉(zhuǎn)換為父類,并且子類中的擴(kuò)展屬性會(huì)被父類“隱性”保留,但不可訪問(編譯出錯(cuò)),以便父類重新轉(zhuǎn)換為子類。
  • 父類不可轉(zhuǎn)為子類,這里倒是很好理解,畢竟多變少可以,少變多就不行了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實(shí)現(xiàn)的ZPL條碼打印類完整實(shí)例

    C#實(shí)現(xiàn)的ZPL條碼打印類完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)的ZPL條碼打印類,結(jié)合實(shí)例形式詳細(xì)分析了C#實(shí)現(xiàn)條碼打印的原理與使用方法,代碼注釋中備有詳盡的說明,便于理解使用,需要的朋友可以參考下
    2016-06-06
  • C#實(shí)現(xiàn)獲取計(jì)算機(jī)信息的示例代碼

    C#實(shí)現(xiàn)獲取計(jì)算機(jī)信息的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)獲取計(jì)算機(jī)軟硬件信息的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-01-01
  • 用Newtonsoft將json串轉(zhuǎn)為對(duì)象的方法(詳解)

    用Newtonsoft將json串轉(zhuǎn)為對(duì)象的方法(詳解)

    下面小編就為大家?guī)硪黄肗ewtonsoft將json串轉(zhuǎn)為對(duì)象的方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解C# 不能用于文件名的字符

    詳解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作為文件名,嘗試重命名一個(gè)文件,輸入/ 就可以看到windows 提示的不能作為文件名的字符,那么具體是包括哪些符號(hào)不能作為文件名呢?下面小編給大家介紹下
    2018-02-02
  • C#操作Word打印的示例

    C#操作Word打印的示例

    這篇文章主要介紹了C#操作Word打印的示例,幫助大家利用c#打印文件,提高辦公效率,感興趣的朋友可以了解下
    2020-10-10
  • C#使用NPOI實(shí)現(xiàn)將表格中數(shù)據(jù)導(dǎo)入Excel

    C#使用NPOI實(shí)現(xiàn)將表格中數(shù)據(jù)導(dǎo)入Excel

    NPOI是.NET版本的POI,可以幫助我們?cè)跊]有安裝Microsoft Office的情況下讀寫Office文件,下面我們就來看看C#如何使用NPOI實(shí)現(xiàn)將表格中數(shù)據(jù)導(dǎo)入Excel吧
    2025-02-02
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶界面響應(yīng)能力和對(duì)Web資源的訪問能力,同時(shí)它使異步代碼的編寫變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 一文搞懂C#實(shí)現(xiàn)讀寫文本文件中的數(shù)據(jù)

    一文搞懂C#實(shí)現(xiàn)讀寫文本文件中的數(shù)據(jù)

    這篇文章重點(diǎn)給大家介紹C#實(shí)現(xiàn)讀寫文本文件中的數(shù)據(jù)的一些知識(shí),讀取.txt文件數(shù)據(jù)的實(shí)例代碼及寫入讀取過程完整代碼,感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • c# rsa注冊(cè)實(shí)現(xiàn)加密文字

    c# rsa注冊(cè)實(shí)現(xiàn)加密文字

    這篇文章主要介紹了c# rsa注冊(cè)實(shí)現(xiàn)加密文字,需要的朋友可以參考下
    2014-04-04
  • c#自帶緩存使用方法 c#移除清理緩存

    c#自帶緩存使用方法 c#移除清理緩存

    這篇文章主要介紹了c#自帶緩存使用方法,包括獲取數(shù)據(jù)緩存、設(shè)置數(shù)據(jù)緩存、移除指定數(shù)據(jù)緩存等方法,需要的朋友可以參考下
    2014-02-02

最新評(píng)論

农安县| 醴陵市| 长治市| 乌苏市| 和顺县| 闽侯县| 新平| 浮山县| 疏勒县| 梁河县| 白水县| 南江县| 耒阳市| 博乐市| 绥棱县| 彩票| 华宁县| 廉江市| 鹰潭市| 普兰县| 元氏县| 和龙市| 阳朔县| 洞头县| 浦北县| 从江县| 吴忠市| 桐庐县| 类乌齐县| 根河市| 开江县| 阜新市| 辽阳市| 禹城市| 南华县| 贵溪市| 临安市| 明水县| 阿尔山市| 雅安市| 许昌市|