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

C#之繼承實(shí)現(xiàn)

 更新時(shí)間:2022年04月11日 11:29:52   作者:Ruby_Lu  
本文詳細(xì)講解了C#之繼承的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一.繼承的類型

在面向?qū)ο蟮木幊讨?,有兩種截然不同繼承類型:實(shí)現(xiàn)繼承和接口繼承

1.實(shí)現(xiàn)繼承和接口繼承

*實(shí)現(xiàn)繼承:表示一個(gè)類型派生于基類型,它擁有該基類型的所有成員字段和函數(shù)。在實(shí)現(xiàn)繼承中,派生類型采用基類型的每個(gè)函數(shù)的實(shí)現(xiàn)代碼,除非在派生類型的定義中指定某個(gè)函數(shù)的實(shí)現(xiàn)代碼。在需要給現(xiàn)有的類型添加功能,或許多相關(guān)的類型共享一組重要的公共功能時(shí),可以使用這種類型的繼承。
*接口繼承:表示一個(gè)類型只繼承了函數(shù)的簽名,沒有繼承任何的代碼。在需要指定該類型具有某些可用的特性時(shí),最好使用這種類型的繼承。

2.多重繼承

C#不支持多重繼承,但C#允許類型派生自多個(gè)接口————多重接口繼承。這說明,C#類可以派生自另一個(gè)類和任意多個(gè)接口。更準(zhǔn)確的說,因?yàn)镾ystem.Object是一個(gè)公共的基類,所以每個(gè)C#(除Object之外)都有一個(gè)基類,還可以有任意多個(gè)接口。

3.結(jié)構(gòu)的繼承

使用結(jié)構(gòu)的一個(gè)限制是結(jié)構(gòu)不支持實(shí)現(xiàn)繼承,但每個(gè)結(jié)構(gòu)都自動(dòng)派生自System.ValueType。不能編碼實(shí)現(xiàn)類型層次的結(jié)構(gòu),但結(jié)構(gòu)可以實(shí)現(xiàn)接口。

二.繼承的實(shí)現(xiàn)

語法:

  class MyDreved:BaseClass
  {

  }

如果類或結(jié)構(gòu)也派生自接口,則用逗號(hào)分隔列表中的基類和接口:

  class MyDreved:BaseClass,IIntenface1,IIntenface2
  {

  }

如果在類定義中沒有指定基類,C#編譯器就假定System.Object是基類。

1.虛方法

把一個(gè)基類函數(shù)聲明為virtual,就可以在任何派生類中重寫(override)該函數(shù):

  class BaseClass
  {
    public virtual void VirtualMethod()
    {
      //
    }
  }

也可以把屬性聲明為virtual。對(duì)于虛屬性或重寫屬性,語法與非虛屬性相同,但要在定義中添加virtual關(guān)鍵字:

  public virtual string Name
  {
    get;set;
  }

C#中虛函數(shù)的概念與標(biāo)準(zhǔn)OOP的概念相同:可以在派生類中重寫虛函數(shù)。在調(diào)用方法時(shí),會(huì)調(diào)用該派生類的合適方法。在C#中,函數(shù)默認(rèn)情況下不是虛的,但(除了構(gòu)造函數(shù))可以顯式的聲明為virtual。
在派生類中重寫一個(gè)函數(shù)時(shí),要使用override關(guān)鍵字顯示聲明:

  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      //
    }
  }

成員字段和靜態(tài)函數(shù)都不能聲明為virtual,因?yàn)檫@個(gè)概念只對(duì)類中的實(shí)例函數(shù)成員有意義。

2.隱藏方法

如果簽名相同的方法在基類和派生類中都進(jìn)行了聲明,但該方法沒有分別聲明為virtual和override,派生類方法就會(huì)隱藏基類方法。

class A 
{
    public void a()
    {
      Console.WriteLine('CLASS is A');
    } 
}

class B:A
{
    public void a()
    {
       Console.WriteLine('CLASS is B');
    }
}

class client 
{
    static void main()
    {
        B b=new B();
       A a=b;

       a.a();
          b.a();
    }
}

/*輸出
CLASS IS A
CLASS IS B
*/

在大多數(shù)情況下,是要重寫方法,而不是隱藏方法,因?yàn)殡[藏方法會(huì)造成對(duì)于給定類的實(shí)例調(diào)用錯(cuò)誤的方法。但是,C#語法會(huì)在編譯時(shí)收到這個(gè)潛在錯(cuò)誤的警告。
在C#中,要隱藏一個(gè)方法應(yīng)使用new 關(guān)鍵字聲明,這樣在編譯時(shí)就不會(huì)發(fā)出警告:

  class A
  {
    public void a()
    {
      Console.WriteLine('CLASS is A');
    }
  }

  class B:A
  {
    public new void a()
    {
       Console.WriteLine('CLASS is B');
    }
  }

3.調(diào)用函數(shù)的基類版本

C#可以從派生類中調(diào)用方法的基本版本:base.<MethodName>()

  class MyDreved: BaseClass
  {
    public override void VirtualMethod()
    {
      base.VirtualMethod();
    }
  }

可以使用base.<MethodName>()語法調(diào)用基類中的任何方法,不必從同一方法的重載中調(diào)用它。

4.抽象類和抽象函數(shù)

C#允許把類和函數(shù)聲明為abstract.抽象類不能實(shí)例化,而抽象不能直接實(shí)現(xiàn),必須在非抽象的派生類中重寫。顯然抽象函數(shù)也是虛擬的(盡管不需要提供virtual,實(shí)際上,也不能提供該關(guān)鍵字)。
如果類包含抽象函數(shù),則該類也是抽象的,也必須聲明為抽象的:

  abstract class Building
  {
    public abstract void Cal();
  }

抽象類中不能聲明非抽象方法,但可以聲明其它的非抽象成員。

5.密封類和密封方法

C#允許把類和方法聲明為sealed。對(duì)于類,這表示不能繼承該類;對(duì)于方法,表示不能重寫該方法。

  sealed class A
  {

  }

  class B:A //報(bào)錯(cuò)
  {

  }

如果基類上不希望有重寫的方法和屬性,就不要把它聲明為virtual.

6.派生類的構(gòu)造函數(shù)

假定沒有為任何類定義任何顯示的構(gòu)造函數(shù),編譯器就會(huì)為所有的類提供默認(rèn)的初始化構(gòu)造函數(shù),在后臺(tái)編譯器可以很好的解決類的層次結(jié)構(gòu)中的問題,每個(gè)類中的每個(gè)字段都會(huì)初始化為對(duì)應(yīng)的默認(rèn)值。
在創(chuàng)建派生類的實(shí)例時(shí),實(shí)際上會(huì)有多個(gè)構(gòu)造函數(shù)起作用。要實(shí)例化的類的構(gòu)造函數(shù)本身不能初始化類,還必須調(diào)用基類中的構(gòu)造函數(shù)。
構(gòu)造函數(shù)的調(diào)用順序是先調(diào)用Object,在按照層次結(jié)構(gòu)調(diào)用基類的構(gòu)造函數(shù),由基類到父類,直到到達(dá)要實(shí)例化的類為止。在這個(gè)過程中,每個(gè)構(gòu)造函數(shù)都初始化它自己的類中的字段。因?yàn)樽钕日{(diào)用的總是基類的構(gòu)造函數(shù),所以派生類在執(zhí)行過程中可以訪問任何基類的成員,因?yàn)榛愐呀?jīng)構(gòu)造出來了,其字段也初始化了。

  • *在層次結(jié)構(gòu)中添加無參數(shù)的構(gòu)造函數(shù) 在層次結(jié)構(gòu)中添加一個(gè)無參數(shù)的構(gòu)造函數(shù)會(huì)替換默認(rèn)的構(gòu)造函數(shù),所以在執(zhí)行過程中,會(huì)默認(rèn)調(diào)用基類中添加的無參數(shù)的構(gòu)造函數(shù)。其它方面不變。
  • *在層次結(jié)構(gòu)中添加帶參數(shù)的構(gòu)造函數(shù) 在層次結(jié)構(gòu)中要調(diào)用這個(gè)帶參數(shù)的構(gòu)造函數(shù),需要在父類的構(gòu)造函數(shù)中顯示調(diào)用:
public abstract class GenericCustomer
{
    private string name;

    public GenericCustomer()
    {
        name = "<no name>";
    }

    public GenericCustomer(string name)
    {
        this.name = name;
    }


    public string Name 
    { 
        get {return name;}
        set {name = value;}
    }

}

public class Nevermore60Customer : GenericCustomer
{
    private string referrerName;
    private uint highCostMinutesUsed;

    ublic Nevermore60Customer(string name) : this(name, "            <None>")
    {
    }

    public Nevermore60Customer(string name, string referrerName) : base(name)
    {
        this.referrerName = referrerName;
    }

    public string ReferrerName
    {
        get {return referrerName;}
         set {referrerName = value;}
    }

}

三. 修飾符

修飾符可以指定方法的可見性:如public或private,還可以指定一項(xiàng)的本質(zhì),如方法是virtual或abstract.

1.可見性修飾符

修飾符應(yīng)用于說明
public所有類和成員任何代碼可以訪問
protected類的成員和內(nèi)嵌類只有在類內(nèi)部和派生類中訪問
internal所有類和成員只有在類內(nèi)部和包含它的程序集中訪問
private類的成員和內(nèi)嵌類只有在類內(nèi)部訪問
protected internal類的成員和內(nèi)嵌類只有在類內(nèi)部,派生類中和包含它的程序集中訪問

不能把類定義為protected,private,protected internal,因?yàn)檫@些修飾符對(duì)于包含在名稱空間中的類型沒有意義。因此這些修飾符只能應(yīng)用于成員。但是可以用這些修飾符定義嵌套的類(內(nèi)嵌類,包含在其它類中的類),因?yàn)樵谶@種情況下,類也具有成員的狀態(tài):

  public class OuterClass
  {
    protected class InnerClass
    {

    }
  }

2.其它修飾符

修飾符應(yīng)用于說明
new函數(shù)隱藏函數(shù)
static所有成員靜態(tài)
virtual函數(shù)成員可以由派生類重寫
abstract類,函數(shù)抽象
override函數(shù)重寫虛擬和抽象的成員
sealed類,方法,屬性不能繼承和重寫
extern僅靜態(tài)方法成員在外部用另一種語言實(shí)現(xiàn)

四.接口

  public interface IDisposable
  {
    void Dispose();
  }

聲明接口在語法上和聲明抽象類完全相同,但不允許提供任何成員的實(shí)現(xiàn)方式。抽象類可以提供除方法之外的其它成員的實(shí)現(xiàn)方式,比如屬性。
一般情況下,接口只能包含方法,屬性,索引器和事件的聲明。
不能實(shí)例化接口,接口即不能有構(gòu)造函數(shù),也不能有字段。接口定義也不允許包含運(yùn)算符重載。
在接口中不允許聲明關(guān)于成員的修飾符。接口成員總是公有的,不能聲明為虛擬和靜態(tài)。如果需要,在實(shí)現(xiàn)的類中聲明。
實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)接口的所有成員。
接口可以彼此繼承,其方式與類的繼承方式相同。

到此這篇關(guān)于C#之繼承實(shí)現(xiàn)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#優(yōu)化if...else代碼的方案總結(jié)

    C#優(yōu)化if...else代碼的方案總結(jié)

    在編寫代碼實(shí)現(xiàn)業(yè)務(wù)需求過程中,會(huì)使用到大量的if...else 判斷語句,隨業(yè)務(wù)復(fù)雜程度不同,導(dǎo)致判斷語句出現(xiàn)多層嵌套、多分支等情況,導(dǎo)致代碼可讀性變差、增加維護(hù)難度,本文介紹了C# 如何優(yōu)化 if...else 讓代碼優(yōu)雅起來,需要的朋友可以參考下
    2024-06-06
  • C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)詳解

    C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于C#中IDispose接口的實(shí)現(xiàn)及為何這么實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用

    Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用

    這篇文章主要為大家介紹了Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C#實(shí)現(xiàn)格式化SQL語句的示例代碼

    C#實(shí)現(xiàn)格式化SQL語句的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)格式化SQL語句的功能,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    C#字體池技術(shù)實(shí)現(xiàn)代碼詳解

    在本篇文章里小編給大家整理的是關(guān)于C#字體池技術(shù)實(shí)現(xiàn)代碼詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • C#轉(zhuǎn)換日期類型實(shí)例

    C#轉(zhuǎn)換日期類型實(shí)例

    這篇文章主要介紹了C#轉(zhuǎn)換日期類型的方法,以實(shí)例形式分析了將日期格式轉(zhuǎn)換為Unix時(shí)間戳與時(shí)區(qū)結(jié)合的形式,是比較實(shí)用的技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • C#多線程學(xué)習(xí)之(四)使用線程池進(jìn)行多線程的自動(dòng)管理

    C#多線程學(xué)習(xí)之(四)使用線程池進(jìn)行多線程的自動(dòng)管理

    這篇文章主要介紹了C#多線程學(xué)習(xí)之使用線程池進(jìn)行多線程的自動(dòng)管理,實(shí)例分析了C#中線程池的概念與相關(guān)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#設(shè)計(jì)模式之Template模板方法模式實(shí)現(xiàn)ASP.NET自定義控件 密碼強(qiáng)度檢測功能

    C#設(shè)計(jì)模式之Template模板方法模式實(shí)現(xiàn)ASP.NET自定義控件 密碼強(qiáng)度檢測功能

    這篇文章主要介紹了C#設(shè)計(jì)模式之Template模板方法模式實(shí)現(xiàn)ASP.NET自定義控件 密碼強(qiáng)度檢測功能,簡單介紹了模板方法模式的定義、原理及檢測密碼強(qiáng)度的相關(guān)使用技巧,需要的朋友可以參考下
    2017-09-09
  • C#控制臺(tái)實(shí)現(xiàn)飛行棋游戲

    C#控制臺(tái)實(shí)現(xiàn)飛行棋游戲

    這篇文章主要為大家詳細(xì)介紹了C#控制臺(tái)實(shí)現(xiàn)飛行棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • C#動(dòng)態(tài)執(zhí)行批處理命令的方法

    C#動(dòng)態(tài)執(zhí)行批處理命令的方法

    這篇文章主要介紹了C#動(dòng)態(tài)執(zhí)行批處理命令的方法,可實(shí)現(xiàn)動(dòng)態(tài)執(zhí)行一系列控制臺(tái)命令,并允許實(shí)時(shí)顯示出來執(zhí)行結(jié)果,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

拉萨市| 新郑市| 赫章县| 龙游县| 钦州市| 青州市| 祁阳县| 汉川市| 鸡东县| 图木舒克市| 鹰潭市| 巴林右旗| 新巴尔虎左旗| 南汇区| 河津市| 保康县| 温泉县| 长海县| 阳江市| 车险| 铜鼓县| 五峰| 沭阳县| 安阳市| 社旗县| 习水县| 定边县| 黑河市| 博乐市| 时尚| 佛教| 岚皋县| 团风县| 泰兴市| 墨玉县| 三门峡市| 阳江市| 洪洞县| 昌宁县| 三台县| 义乌市|