<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 繼承(C# 編程指南) 繼承(加上封裝和多態性)是面向對象的編程的三個主要特性(也稱為“支柱”)之一。 繼承用于創建可重用、擴展和修改在其他類中定義的行為的新類。其成員被繼承的類稱為“基類”,繼承這些成員的類稱為“派生類”。派生類只能有一個直接基類。但是,繼承是可傳遞的。如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,則 ClassC 會繼承 ClassB 和 ClassA 中聲明的成員。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 結構不支持繼承,但可以實現接口。有關更多信息,請參見 [接口(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173156.aspx)。 | 從概念上來說,派生類是基類的特例。 例如,如果您有一個基類 Animal,則可以有一個名為 Mammal 的派生類和一個名為 Reptile 的派生類。 Mammal 是一個 Animal,Reptile 也是一個 Animal,但每個派生類均表示基類的不同專用化。 定義一個類從其他類派生時,派生類隱式獲得基類的除構造函數和析構函數以外的所有成員。因此,派生類可以重用基類中的代碼而無需重新實現這些代碼。可以在派生類中添加更多成員。派生類以這種方式擴展基類的功能。 下圖演示一個 WorkItem 類,該類表示某業務流程中的一個工作項。和所有的類一樣,該類派生自 [System.Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 并繼承其所有方法。 WorkItem 添加了自己的五個成員。其中包括一個構造函數,因為構造函數不能繼承。類ChangeRequest 繼承自 WorkItem 并表示特定種類的工作項。 ChangeRequest 在它從 WorkItem 和 [Object](https://msdn.microsoft.com/zh-CN/library/system.object.aspx) 繼承的成員中另外添加了兩個成員。它必須添加其自己的構造函數,還添加 originalItemID。利用屬性 originalItemID,可將 ChangeRequest 實例與更改請求將應用到的原始 WorkItem 相關聯。 ![類繼承](https://i-msdn.sec.s-msft.com/dynimg/IC376124.jpeg "類繼承") 類繼承 下面的示例演示如何以 C# 表示上圖所示的類關系。該示例還演示 WorkItem 如何重寫虛方法 [Object.ToString](https://msdn.microsoft.com/zh-CN/library/system.object.tostring.aspx),以及 ChangeRequest 類如何繼承該方法的 WorkItem 實現。 ``` // WorkItem implicitly inherits from the Object class. public class WorkItem { // Static field currentID stores the job ID of the last WorkItem that // has been created. private static int currentID; //Properties. protected int ID { get; set; } protected string Title { get; set; } protected string Description { get; set; } protected TimeSpan jobLength { get; set; } // Default constructor. If a derived class does not invoke a base- // class constructor explicitly, the default constructor is called // implicitly. public WorkItem() { ID = 0; Title = "Default title"; Description = "Default description."; jobLength = new TimeSpan(); } // Instance constructor that has three parameters. public WorkItem(string title, string desc, TimeSpan joblen) { this.ID = GetNextID(); this.Title = title; this.Description = desc; this.jobLength = joblen; } // Static constructor to initialize the static member, currentID. This // constructor is called one time, automatically, before any instance // of WorkItem or ChangeRequest is created, or currentID is referenced. static WorkItem() { currentID = 0; } protected int GetNextID() { // currentID is a static field. It is incremented each time a new // instance of WorkItem is created. return ++currentID; } // Method Update enables you to update the title and job length of an // existing WorkItem object. public void Update(string title, TimeSpan joblen) { this.Title = title; this.jobLength = joblen; } // Virtual method override of the ToString method that is inherited // from System.Object. public override string ToString() { return String.Format("{0} - {1}", this.ID, this.Title); } } // ChangeRequest derives from WorkItem and adds a property (originalItemID) // and two constructors. public class ChangeRequest : WorkItem { protected int originalItemID { get; set; } // Constructors. Because neither constructor calls a base-class // constructor explicitly, the default constructor in the base class // is called implicitly. The base class must contain a default // constructor. // Default constructor for the derived class. public ChangeRequest() { } // Instance constructor that has four parameters. public ChangeRequest(string title, string desc, TimeSpan jobLen, int originalID) { // The following properties and the GetNexID method are inherited // from WorkItem. this.ID = GetNextID(); this.Title = title; this.Description = desc; this.jobLength = jobLen; // Property originalItemId is a member of ChangeRequest, but not // of WorkItem. this.originalItemID = originalID; } } class Program { static void Main() { // Create an instance of WorkItem by using the constructor in the // base class that takes three arguments. WorkItem item = new WorkItem("Fix Bugs", "Fix all bugs in my code branch", new TimeSpan(3, 4, 0, 0)); // Create an instance of ChangeRequest by using the constructor in // the derived class that takes four arguments. ChangeRequest change = new ChangeRequest("Change Base Class Design", "Add members to the class", new TimeSpan(4, 0, 0), 1); // Use the ToString method defined in WorkItem. Console.WriteLine(item.ToString()); // Use the inherited Update method to change the title of the // ChangeRequest object. change.Update("Change the Design of the Base Class", new TimeSpan(4, 0, 0)); // ChangeRequest inherits WorkItem's override of ToString. Console.WriteLine(change.ToString()); // Keep the console open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } } /* Output: 1 - Fix Bugs 2 - Change the Design of the Base Class */ ``` ## 抽象方法和虛方法 當基類將方法聲明為 [virtual](https://msdn.microsoft.com/zh-CN/library/9fkccyh4.aspx) 時,派生類可以用自己的實現[重寫](https://msdn.microsoft.com/zh-CN/library/ebca9ah3.aspx)該方法。如果基類將成員聲明為 [abstract](https://msdn.microsoft.com/zh-CN/library/sf985hc5.aspx),則在直接繼承自該類的任何非抽象類中都必須重寫該方法。如果派生類自身是抽象的,則它繼承抽象成員而不實現它們。抽象成員和虛成員是多態性的基礎,多態性是面向對象的編程的第二個主要特性。有關更多信息,請參見 [多態性(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173152.aspx)。 ## 抽象基類 如果希望禁止通過 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx)關鍵字直接進行實例化,可以將類聲明為[abstract](https://msdn.microsoft.com/zh-CN/library/sf985hc5.aspx)如果這樣做,則僅當從該類派生新類時才能使用該類。抽象類可以包含一個或多個自身聲明為抽象的方法簽名。這些簽名指定參數和返回值,但沒有實現(方法體)。抽象類不必包含抽象成員;但是,如果某個類確實包含抽象成員,則該類自身必須聲明為抽象類。自身不是抽象類的派生類必須為抽象基類中的任何抽象方法提供實現。有關更多信息,請參見 [抽象類、密封類及類成員(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。 ## 接口 “接口”是一種引用類型,有點像僅包含抽象成員的抽象基類。類在從接口實現時必須為該接口的所有成員提供實現。類雖然只能從一個直接基類派生,但可以實現多個接口。 接口用于為不一定具有“是”關系的類定義特定功能。例如,[System.IEquatable&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/ms131187.aspx) 接口可由任何類或構造實現,這些類或構造必須啟用代碼來確定該類型的兩個對象是否等效(但是該類型定義等效性)。 [IEquatable&lt;T&gt;](https://msdn.microsoft.com/zh-CN/library/ms131187.aspx) 不表示基類和派生類之間存在的同一種“是”關系(例如 Mammal 是 Animal)。有關更多信息,請參見 [接口(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173156.aspx)。 ## 派生類對基類成員的訪問 派生類可以訪問基類的公共成員、受保護成員、內部成員和受保護內部成員。即使派生類繼承基類的私有成員,仍不能訪問這些成員。但是,所有這些私有成員在派生類中仍然存在,且執行與基類自身中相同的工作。例如,假定一個受保護基類方法訪問私有字段。要使繼承的基類方法正常工作,派生類中必須有該字段。 ## 禁止進一步派生 類可以將自身或其成員聲明為 [sealed](https://msdn.microsoft.com/zh-CN/library/88c54tsw.aspx),從而禁止其他類從該類自身或其任何成員繼承。有關更多信息,請參見 [抽象類、密封類及類成員(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173150.aspx)。 ## 派生類隱藏基類成員 派生類可以通過以相同的名稱和簽名聲明基類成員來隱藏這些成員。可以使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx) 修飾符顯式指示成員不作為基類成員的重寫。不是必須要使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx),但如果不使用 [new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx),將生成編譯器警告。有關更多信息,請參見[使用 Override 和 New 關鍵字進行版本控制(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/6fawty39.aspx)和 [了解何時使用 Override 和 New 關鍵字(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173153.aspx)。 ## 請參閱 [C# 編程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [類和結構(C# 編程指南)](https://msdn.microsoft.com/zh-CN/library/ms173109.aspx) [class(C# 參考)](https://msdn.microsoft.com/zh-CN/library/0b0thckt.aspx) [struct(C# 參考)](https://msdn.microsoft.com/zh-CN/library/ah19swz4.aspx)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看