欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解C#之繼承

 更新時間:2021年07月08日 17:20:42   作者:佳園  
這篇文章主要介紹了c# 繼承的相關(guān)資料,文中講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望能給你帶來幫助

C#之繼承

繼承、封裝和多態(tài)是面向?qū)ο缶幊痰闹匾匦浴?/p>

其成員被繼承的類叫基類也稱父類,繼承其成員的類叫派生類也稱子類。

派生類隱式獲得基類的除構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員。派生類只能有一個直接基類,所以C#并不支持多重繼承,但一個基類可以有多個直接派生類。

繼承是可以傳遞的。

即:如果 ClassB 派生出 ClassCClassA 派生出 ClassB,則 ClassC 會繼承 ClassB ClassA 中聲明的成員。

 class A
    {
        public void Sum(int i,int j)
        {
            int sum = i + j;
            Console.WriteLine("I am A ,my sum ={0}",sum);
        }
    }
    class B : A
    {
        public void Minus(int i,int j)
        {
            int minus = i - j;
            Console.WriteLine("I am B ,my minus ={0}", minus);
            this.Sum(3, 4);
        }
    }
    class InheritanceTest1
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.Minus(3, 4);
            Console.Read();
        }
    }

結(jié)果:

I am B ,my minus=-1

I am A ,my sum = 7

試想一下,當(dāng)基類Sum()方法是私有時,派生類還會繼承該方法嗎?

經(jīng)過本人測試,沒有在B類找到該方法,那么是不是它就沒有被繼承呢?其實不是的,私有成員其實已經(jīng)被繼承了,但是它們卻不可以被訪問,因為私有成員只能被聲明它們的類或結(jié)構(gòu)體中才可訪問,所以看上去像是沒有被繼承。

如果我們想降低訪問基本,我們可以把基類Sum()方法定義為protected。

能夠阻止某個類被其他類繼承嗎?

答案是可以的,C#提供了一個sealed 修飾符,此修飾符會阻止其他類從該類繼承。

   sealed class A
    {
        int test;
        public void Sum(int i,int j)
        {
            int sum = i + j;
            Console.WriteLine("I am A ,my sum ={0}",sum);
        }
    }
    class B : A 
    {
        public void Minus(int i,int j)
        {
            int minus = i - j;
            Console.WriteLine("I am B ,my minus ={0}", minus);
            this.Sum(3, 4);       //編譯器會報錯    
        }
     }

前面說過,派生類隱式獲得基類的除構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員。

那么我們該如何獲得基類的構(gòu)造函數(shù)和自身的構(gòu)造函數(shù)呢?

我們知道基類的初始化工作由基類的構(gòu)造函數(shù)完成,派生類的初始化工作則有派生類的構(gòu)造函數(shù)完成,但是這樣就產(chǎn)生了派生類構(gòu)造函數(shù)的執(zhí)行順序問題。

當(dāng)基類沒有構(gòu)造函數(shù),派生類也沒有構(gòu)造函數(shù)時,派生類新曾成員的初始化工作由其他公有函數(shù)來完成。

 public  class A
    {
        int test=0;
        public void sum()
        {
            test++;
            Console.WriteLine("I am test ={0}" ,test);
        }
    }
    class B : A 
    {
        int i;
        public void PrintInt()
        {
            i = 3;
            Console.WriteLine("I am i ={0}", i);
        }
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B();
            b.PrintInt();
            Console.Read();
        }
    }

結(jié)果:

I am i=3

如果只有派生類定義構(gòu)造函數(shù)時,只需構(gòu)造派生類對象即可。對象的基類部分使用默認(rèn)構(gòu)造函數(shù)來自動創(chuàng)建。當(dāng)基類和派生類

都定義有構(gòu)造函數(shù)時,那么執(zhí)行順序會怎樣呢?

如果基類中是沒有參數(shù)的構(gòu)造函數(shù),那么他可以隱式的被派生類執(zhí)行,也就是說,派生類根本不需要包含構(gòu)造函數(shù)如果基類中是沒有參數(shù)的構(gòu)造函數(shù),在派生類中可以自定義有參數(shù)的構(gòu)造函數(shù)publicclassA

public  class A
    {
        int test=0;
        public A()
        {
            test = 5;
            Console.WriteLine("I am A 公有默認(rèn)構(gòu)造函數(shù) ,test={0}", test);
        }
    }
    class B : A 
    {
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B();
            Console.Read();
        }
    }

結(jié)果:

I am A 公有默認(rèn)構(gòu)造函數(shù) ,test=5

由此可以看見,基類的構(gòu)造函數(shù)被執(zhí)行,在派生類中被調(diào)用。

如果基類定義了帶有參數(shù)的構(gòu)造函數(shù),那么此構(gòu)造函數(shù)必須被執(zhí)行,且在派生類中實現(xiàn)該構(gòu)造函數(shù),此時我們可以使用base關(guān)鍵字

   class A
    {
        int test=0;
        public A(int i)
        {
            test = i;
            Console.WriteLine("I am A 公有有參構(gòu)造函數(shù) ,test={0}", test);
        }
    }
    class B : A 
    {
        public B(int j):base(j)
        {
            Console.WriteLine("I am B 公有有參構(gòu)造函數(shù),j={0}",j);
        }
    }
    class InheritanceTest1 
    {
        static void Main(string[] args)
        {
            B b = new B(1);
            Console.Read();
        }
    }

結(jié)果:

I am A 公有有參構(gòu)造函數(shù) ,test=1

I am B 公有有參構(gòu)造函數(shù),j=1

由此可見: 派生類隱式執(zhí)行基類中帶有參數(shù)的構(gòu)造函數(shù),在程序中基類定義了帶有參數(shù)的構(gòu)造函數(shù),在其派生類中被繼承,并使用base關(guān)鍵字調(diào)用基類中的構(gòu)造函數(shù)來傳送參數(shù)。

我們可以從代碼中看到在創(chuàng)建派生類的對象后,程序首先運行的是基類的構(gòu)造函數(shù)中的內(nèi)容,然后才是派生類中的內(nèi)容。

如果派生類的基類也是派生類,則每個派生類只需負(fù)責(zé)其直接基類的構(gòu)造,不負(fù)責(zé)間接基類的構(gòu)造,并且其執(zhí)行構(gòu)造函數(shù)的順序是從最上面的基類開始的,直到最后一個派生類結(jié)束。

總結(jié)

本篇文章就到這里了,希望可以幫助到你,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Unity常用音頻操作類示例代碼

    Unity常用音頻操作類示例代碼

    這篇文章主要介紹了Unity常用音頻操作類,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • C#如何給PPT中圖表添加趨勢線詳解

    C#如何給PPT中圖表添加趨勢線詳解

    趨勢線是一條最為符合統(tǒng)計規(guī)律的回歸線,方便我們提前了解數(shù)據(jù)如何變化的趨勢,下面這篇文章主要給大家介紹了關(guān)于C#如何給PPT中圖表添加趨勢線的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C#?基于NAudio實現(xiàn)對Wav音頻文件剪切(限PCM格式)

    C#?基于NAudio實現(xiàn)對Wav音頻文件剪切(限PCM格式)

    本文主要介紹了C#基于NAudio工具對Wav音頻文件進行剪切,可以將一個音頻文件剪切成多個音頻文件(限PCM格式),感興趣的小伙伴可以學(xué)習(xí)一下
    2021-11-11
  • C#生成Word文件(圖片、文字)

    C#生成Word文件(圖片、文字)

    這篇文章主要為大家詳細(xì)介紹了C#生成Word文件,包括圖片、文字等素材,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C#文件合并的方法

    C#文件合并的方法

    這篇文章主要介紹了C#文件合并的方法,實例分析了C#基于FileStream操作文件合并的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 詳解C# 中Session的用法

    詳解C# 中Session的用法

    這篇文章主要介紹了C# 中Session的用法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • webBrowser代理設(shè)置c#代碼

    webBrowser代理設(shè)置c#代碼

    本文將介紹C# 為webBrowser設(shè)置代理實現(xiàn)代碼,需要了解的朋友可以參考下
    2012-11-11
  • C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解

    C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解

    這篇文章主要介紹了C# 總結(jié)QueueUserWorkItem傳參幾種方式案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C# 無邊框窗體邊框陰影效果的簡單實現(xiàn)

    C# 無邊框窗體邊框陰影效果的簡單實現(xiàn)

    這篇文章介紹了C# 無邊框窗體邊框陰影效果的簡單實現(xiàn),有需要的朋友可以參考一下
    2013-10-10
  • C#使用泛型實現(xiàn)獲取并顯示員工信息

    C#使用泛型實現(xiàn)獲取并顯示員工信息

    泛型編程是一種編程方式,它利用“參數(shù)化類型”將類型抽象化,從而實現(xiàn)更為靈活的復(fù)用,泛型是用于處理算法、數(shù)據(jù)結(jié)構(gòu)的一種編程方法,本文給大家介紹了C#使用泛型實現(xiàn)獲取并顯示員工信息實例,需要的朋友可以參考下
    2024-02-02

最新評論