close
類型種別 隱含擔當自
班級
佈局體
enum 、 、
委託 、 、

繼續和「是一種」關係

的一般功能合用於任何類型。

public struct ValueStructure : ValueType // Generates CS0527.
{
}

隱含繼續

除可能透過單一繼承獲得的任何類型外,.NET 類型系統中的所有類型都隱含地繼續自 或由它衍生的類型。

測試兩個物件相等的三種方式:公用實例 Equals(Object) 方式、公用靜態 Equals(Object, Object) 方式,和公用靜態 ReferenceEquals(Object, Object) 方式。

按照預設,這些方式會測試參考相等性;也就是說,若要相等,兩個物件變數必需參考溝通的物件。

在敕令提醒字元中輸入 饬令,以設立建設新的 .NET Core 專案。 繼承是面向物件程式設計說話的功能,可讓您定義供應特定功能(數據和行為)的基類,和定義擔當或覆寫該功能的衍生類別。

本講授課程介紹 C# 中的繼承。

從號令行輸入 敕令,以載入或還原專案的相依性。

若要查看隱含繼續的意義,讓我們界說新的類別,SimpleClass,這隻是空的種別定義:

在其他平臺上,您必須個體安裝這些元件。毛病訊息指出,固然您可以定義構造實作的介面,但不支持繼續。

public abstract class A
{
    public abstract void Method1();
}

public class B : A // Generates CS0534.
{
    public void Method3()
    {
        // Do something.
    }
}

擔當僅合用於種別和介面。 由於這些規則,測驗考試像以下範例一樣編譯程式代碼會產生編譯程式毛病 CS0527:“介面清單中的類型 'ValueType' 不是介面。 其他類型種別(結構、委派和羅列)不支撐繼續。

,其會初始化 種別的靜態數據。

一般而言,繼承是用來示意基類與一或多個衍生類別之間的「是」關聯性,此中衍生種別是基類的特別版本;衍生種別是基類的類型。 例如,Publication 種別代表任何類型的刊行集,而 BookMagazine 類別則代表特定類型的刊行集。

若要認識如何經管 NuGet 套件源,請參閱 。

  • 在 Windows 上,使用此 來安裝所有需要前提。

    假如您已安裝某些專案,WinGet 將會略過此步驟。 例如,下列典範會呼叫 SimpleClass.ToString 方式,SimpleClass 擔當自 。

    由於隱含擔當,您可以從 SimpleClass 物件呼喚任何擔當的成員,就好像它現實上是在 SimpleClass 種別中定義的成員一樣。

      1. 換句話說,類型 D 可以擔當自類型 C,而類型 C繼承自類型 A,而類型 A繼續自基類類型 。 也就是說,種別只能繼續自單一類別。

        C# 和 .NET 僅支援 單一繼承。 因為繼承是可轉移的,因此類型 A 的成員可用於類型 D。 不外,繼續是可轉移的,可以讓您界說一組類型的繼續階層。

      2. 受保護的 方式,其設計目標是在垃圾搜集器收受接管物件記憶體之前釋放非受控資源。 繼續基類成員的類別稱為 衍生類別

        繼續 是面向物件程序設計的基本屬性之一。 擔當成員的種別稱為 基類。 它可以讓您定義可重複利用(繼承)、擴充或點竄父種別行為的子種別。

        公有繼續成員可以像是在衍生類別中界說的一樣被呼叫。

        成員在衍生種別中可見,並且是衍生種別公用介面的一部門。 在下列範例中,種別 A 會界說名為 Method1的方式,而 種別 B 擔當自 種別 A。 然後,此規範會呼喚 Method1,就像是 B上的實例方式一樣。

        公用 ToString 方式會將 SimpleClass 物件轉換成其字串透露表現法,會傳回完整型別名稱。 在此環境下,ToString 方法會傳回字串 「SimpleClass」。

        種別或結構可以實作一或多個介面。 雖然介面的實作常常被視為單一繼續或結構利用繼承的權宜之計,但它的目標是表達介面與其實作型別之間的不同關係,即「能履行」的關係,而非繼承。 介面界說了一組功能子集(例如測試相等性、比力或排序物件的能力,或支援對文化特征敏感的剖析與格式化),並將這些功能供給給實作該介面的類型。

        建立目次來儲存典範榜樣。

        您沒必要執行 ,因為其會由需要進行還原的所有號令隱含執行,例如 dotnet newdotnet builddotnet rundotnet testdotnet publishdotnet pack。 若要停用隱含還原,請利用 --no-restore 選項。

        固然基類的所有其他成員都是由衍生種別繼承的,但不論它們是不是可見,都取決於其存取規模。 成員的存取規模會影響其衍生類別的可見性,以下所示:

      3. public class SimpleClass
        { }
        

        SimpleClass 類型的成員清單。 其中一個成員是 C# 編譯程式主動為 SimpleClass 類型供給的無參數(或預設)建構函式。 其餘八個是 的成員,這是 .NET 類型系統中所有種別和介面最終都邑隱含繼承的類型。

        雖然您尚未在 SimpleClass 類別中定義任何成員,但規範的輸出指出它現實上有 9 個成員。
        • 將類型中的程式代碼複製並貼到程式碼編纂器中。

          public class A
          {
              private int _value = 10;
          
              public class B : A
              {
                  public int GetValue()
                  {
                      return _value;
                  }
              }
          }
          
          public class C : A
          {
              //    public int GetValue()
              //    {
              //        return _value;
              //    }
          }
          
          public class AccessExample
          {
              public static void Main(string[] args)
              {
                  var b = new A.B();
                  Console.WriteLine(b.GetValue());
              }
          }
          // The example displays the following output:
          //       10
          
        • 成員只能在衍生種別中顯示。

          先決前提

          • 最新
          • 編纂器

          安裝指示

      靠山:什麼是繼續?

      公用 GetHashCode 方式,該方式較量爭論出一個值,使得型其它實例可以在哈希調集中使用。

    • 如果您在義務欄中收到閃灼的用戶帳戶節制 (UAC) 提示,請許可安裝繼續。
    1. 下載檔案,然後按兩下以執行它。
    2. 閱讀許可和談,輸入 y,然後在系統提示接受時拔取 [輸入]。
      public class A
      {
          public void Method1()
          {
              // Method implementation.
          }
      }
      
      public class B : A
      { }
      
      public class Example
      {
          public static void Main()
          {
              B b = new ();
              b.Method1();
          }
      }
      
    3. 衍生類別也能夠藉由提供替換實作,覆寫繼續的成員。 若要可以或許覆寫成員,基類中的成員必需以 樞紐詞標示。

      嘗試覆寫非虛擬成員,以下列類型所示,會產生編譯程式毛病 CS0506:“<成員> 沒法覆寫繼續的成員 <成員>,因為它未標示為虛擬、抽象或覆寫。 憑據預設,基類成員不會標示為 virtual,且沒法覆寫。

      public GetType 方式,會傳回代表 型另外 SimpleClass 物件。

  • using System.Reflection;
    
    public class SimpleClassExample
    {
        public static void Main()
        {
            Type t = typeof(SimpleClass);
            BindingFlags flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
                                 BindingFlags.NonPublic | BindingFlags.FlattenHierarchy;
            MemberInfo[] members = t.GetMembers(flags);
            Console.WriteLine($"Type {t.Name} has {members.Length} members: ");
            foreach (MemberInfo member in members)
            {
                string access = "";
                string stat = "";
                var method = member as MethodBase;
                if (method != null)
                {
                    if (method.IsPublic)
                        access = " Public";
                    else if (method.IsPrivate)
                        access = " Private";
                    else if (method.IsFamily)
                        access = " Protected";
                    else if (method.IsAssembly)
                        access = " Internal";
                    else if (method.IsFamilyOrAssembly)
                        access = " Protected Internal ";
                    if (method.IsStatic)
                        stat = " Static";
                }
                string output = $"{member.Name} ({member.MemberType}): {access}{stat}, Declared by {member.DeclaringType}";
                Console.WriteLine(output);
            }
        }
    }
    // The example displays the following output:
    //	Type SimpleClass has 9 members:
    //	ToString (Method):  Public, Declared by System.Object
    //	Equals (Method):  Public, Declared by System.Object
    //	Equals (Method):  Public Static, Declared by System.Object
    //	ReferenceEquals (Method):  Public Static, Declared by System.Object
    //	GetHashCode (Method):  Public, Declared by System.Object
    //	GetType (Method):  Public, Declared by System.Object
    //	Finalize (Method):  Internal, Declared by System.Object
    //	MemberwiseClone (Method):  Internal, Declared by System.Object
    //	.ctor (Constructor):  Public, Declared by SimpleClass
    

    種別的隱含擔當可以讓 SimpleClass 類別利用這些方式:

    輸入 敕令,以編譯和執行類型。

    ,這些終結實由履行階段的垃圾收集器呼喚,用於銷毀類別的實例。

  • 每一個基底類型城市讓一組分歧的成員透過擔當提供給隱式衍生類型。
    public class EmptyClass
    { }
    
    public class ClassNameExample
    {
        public static void Main()
        {
            EmptyClass sc = new();
            Console.WriteLine(sc.ToString());
        }
    }
    // The example displays the following output:
    //        EmptyClass
    

    下表列出您可以在 C# 中建樹的類型種別,和其隱含繼承的起原類型。

    受保護的 方式,這個方法會建立目前 對象的淺層複製品。 以下成員不會擔當:

    不是基類的所有成員都是由衍生種別繼續。

  • 從 首頁下載最新的安裝程式,然後按兩下以履行它。 選取 [安裝]。
  • 執行規範

    該頁面還會偵測您的平臺,並且應當供給合適您系統的正確保持。 這樣會開啟 Visual Studio 程式代碼,並扣問您是不是要安裝或啟用延長模組。

    1. 從 ,然後按兩下以執行它。
    2. 按兩下 擴充功能頁面上的 [安裝] 按鈕。 下載頁面會偵測您的平臺,並建議您平臺的最新安裝程式。
    3. dotnet restore 敕令在合適進行明白還原的特定案例中仍可派上用處,例如 ,或在需要明確節制何時進行還原的組建系統中。

      成員只能在其基類巢狀的衍生種別中顯示。 不然,在衍生種別中看不到它們。不過,假如您從 C.GetValue 方法中移除批注,並測驗考試編譯此規範,它會產生編譯程序錯誤 CS0122:“'A._value' 由於其保護品級而沒法存取。 私家 A._value 欄位會顯示在 A.B 中。

      在下列範例中,A.B 是衍生自 A的巢狀類別,C 衍生自 A
    4. 成員只有在與基類位於溝通組件的衍生種別中才可見。

      衍生類別位於與基類不同的元件中,是以無法看到它們。

      若要在本教學課程中創立並執行規範,您可以從饬令行使用 公用程式。 針對每個範例,請遵守下列步調:

    arrow
    arrow
      全站熱搜
      創作者介紹

      virgiltqk6ly7 發表在 痞客邦 留言(0) 人氣()