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

一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別

 更新時(shí)間:2023年03月28日 10:38:56   作者:letmebaby  
這篇文章主要為大家詳細(xì)介紹了C#中重寫(xiě)(override)及覆蓋(new)這兩個(gè)關(guān)鍵詞的區(qū)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

1. 重寫(xiě)和覆蓋的定義

1.1 重寫(xiě)(override)的定義

在C#中,用override關(guān)鍵字來(lái)重寫(xiě)一個(gè)父類中的虛方法或抽象方法。override關(guān)鍵字用于指示編譯器,我要用派生類中的一個(gè)方法,重寫(xiě)基類中的同名方法。通過(guò)重寫(xiě)基類中的方法,可以實(shí)現(xiàn)多態(tài)性。有關(guān)重寫(xiě)與虛方法和抽象方法的詳細(xì)示例,可移步C#虛方法和抽象方法示例

override關(guān)鍵字的語(yǔ)法如下:

public override returnType MethodName(ParameterList)
{
    // 方法實(shí)現(xiàn)
}

其中,public表示訪問(wèn)修飾符;override表示重寫(xiě)虛方法或抽象方法;returnType表示方法的返回類型;MethodName表示方法名稱;ParameterList表示方法的參數(shù)列表。

需要注意的是,重寫(xiě)方法的訪問(wèn)修飾符必須與被重寫(xiě)方法的訪問(wèn)修飾符相同或更為寬松。

1.2 覆蓋(new)的定義

在C#中,用new關(guān)鍵字來(lái)覆蓋一個(gè)父類中的成員方法或成員變量。new關(guān)鍵字用于指示編譯器,派生類中的一個(gè)方法或變量將隱藏基類中的同名方法或變量,從而改變了繼承體系中的原有布局關(guān)系。

new關(guān)鍵字的語(yǔ)法如下:

new returnType MemberName(ParameterList)
{
    // 成員實(shí)現(xiàn)
}

其中,returnType表示成員的返回類型;MemberName表示成員的名稱;ParameterList表示成員的參數(shù)列表。

2. 兩者的區(qū)別及示例

下面是一個(gè)示例:

//父類
  public class FatherClass
  {
    public virtual string GetName()
    {
      return "我是父類中的虛擬方法";
    }
  }
  //子類1
  public class SonClass1 : FatherClass
  {
    public override string GetName()
    {
      return "我是子類1中的重寫(xiě)方法";
    }
  }
  //子類2
  public class SonClass2 : FatherClass
  {
    public new string GetName()
    {
      return "我是子類2中的覆蓋方法";
    }
  }

隨后通過(guò)程序入口函數(shù)調(diào)用:

 public class Program
  {
    public static void Main(string[] args)
    {
      FatherClass fatherClass = new FatherClass();
      Console.Write("直接調(diào)用父類中的虛方法:");
      Console.WriteLine(fatherClass.GetName());

      SonClass1 s1 = new SonClass1();
      Console.Write("直接調(diào)用子類1中的重寫(xiě)方法:");
      Console.WriteLine(s1.GetName());

      SonClass2 s2 = new SonClass2();
      Console.Write("直接調(diào)用子類2中的覆蓋方法:");
      Console.WriteLine(s2.GetName());

      FatherClass f1 = new SonClass1();
      Console.Write("聲明父類,調(diào)用子類1中的重寫(xiě)方法:");
      Console.WriteLine(f1.GetName());

      FatherClass f2 = new SonClass2();
      Console.Write("聲明父類,調(diào)用子類2中的覆蓋方法:");
      Console.WriteLine(f2.GetName());
    }
  }

運(yùn)行程序,得到的結(jié)果如下:

直接調(diào)用父類中的虛方法:我是父類中的虛擬方法
直接調(diào)用子類1中的重寫(xiě)方法:我是子類1中的重寫(xiě)方法
直接調(diào)用子類2中的覆蓋方法:我是子類2中的覆蓋方法

聲明父類,調(diào)用子類1中的重寫(xiě)方法:我是子類1中的重寫(xiě)方法
聲明父類,調(diào)用子類2中的覆蓋方法:我是父類中的虛擬方法

總結(jié)

1:不管是重寫(xiě)還是覆蓋都不會(huì)影響父類自身的功能。

2:當(dāng)用子類創(chuàng)建父類的時(shí)候,如 FatherClass f1 = new SonClass1(),重寫(xiě)會(huì)改變父類的功能,即調(diào)用子類的功能;而覆蓋不會(huì),仍然調(diào)用父類功能。

3:虛方法、實(shí)方法都可以被覆蓋(new),但是抽象方法,接口 不可以。

4:抽象方法,接口,標(biāo)記為virtual的方法可以被重寫(xiě)(override),實(shí)方法不可以。

5:重寫(xiě)使用的頻率比較高,實(shí)現(xiàn)多態(tài);覆蓋用的頻率比較低,用于對(duì)以前無(wú)法修改的類進(jìn)行繼承的時(shí)候。

小拓展:當(dāng)使用new關(guān)鍵字覆蓋一個(gè)成員方法或變量時(shí),隱藏的成員在類層次結(jié)構(gòu)中的位置會(huì)改變,它會(huì)在派生類中被重新定義,而不是從基類中繼承。當(dāng)基類對(duì)象引用派生類對(duì)象時(shí),派生類中隱藏的成員不被基類引用所包含,因此它們無(wú)法訪問(wèn)。而在派生類中,新定義的成員將起作用,完全與基類中的同名成員無(wú)關(guān)。

到此這篇關(guān)于一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別的文章就介紹到這了,更多相關(guān)C# 重寫(xiě) 覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論