2012-02-07 72 views
10

我只是讀在C#繼承中,我遇到了構造函數和被寫了構造函數中派生的順序執行。這是什麼意思?這個基類的構造函數將被稱爲first或Derived類。訂購調用繼承的構造情況下,在C#中

+3

是的,基類對象必須在派生類對象之前構造。 – 2012-02-07 05:56:22

回答

15

甲基類構造函數被調用first.Refer以下示例

// Demonstrate when constructors are called. 
using System; 

// Create a base class. 
class A { 
    public A() { 
     Console.WriteLine("Constructing A."); 
    } 
} 

// Create a class derived from A. 
class B : A { 
    public B() { 
     Console.WriteLine("Constructing B."); 
    } 
} 

// Create a class derived from B. 
class C : B { 
    public C() { 
     Console.WriteLine("Constructing C."); 
    } 
} 

class OrderOfConstruction { 
    static void Main() { 
     C c = new C(); 
    } 
} 

The output from this program is shown here: 

Constructing A. 
Constructing B. 
Constructing C. 
2

基類的構造將被首先調用。您可以測試這個很容易地自己:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DerivationTest 
{ 
    class Program 
    { 
     public class Thing 
     { 
      public Thing() 
      { 
       Console.WriteLine("Thing"); 
      } 
     } 

     public class ThingChild : Thing 
     { 
      public ThingChild() 
      { 
       Console.WriteLine("ThingChild"); 
      } 
     } 

     static void Main(string[] args) 
     { 
      var tc = new ThingChild(); 
      Console.ReadLine(); 
     } 
    } 
} 
2

類構造函數的調用由派生隱含的順序,不過要注意的是,在C#中是很重要的,字段初始化(如int foo=5)的基類的構造函數之前運行,從而以相反的順序運行。如果基礎構造函數可能會導致在派生類中被覆蓋的虛擬函數在基礎構造函數完成之前被調用,那麼這將非常有用。這樣的函數將會看到由字段初始化器初始化的任何變量被初始化。

VB.net,順便說一句,運行所有字段初始化基類的構造完成後,但在派生類的構造任何東西(比鏈中的其他於基座構造函數)之前。這意味着虛擬方法必須意識到字段初始值設定項可能沒有運行,但也意味着字段初始值設定項可以在構造中使用對象(它們在C#中不能這樣做)。順便說一下,在VB.net中,雖然笨重,但類可以用新創建的IDisposable實例安全地初始化字段(並確保如果構建過程的任何部分拋出異常,它們將被丟棄)。在C#中,如果構造拋出異常,必須避免使用字段初始值設定項來創建任何不能安全放棄的內容,因爲無法訪問部分構建的對象來清除它。

0
using System; 

class Parent 
{ 
    public Parent() { 
    Console.WriteLine("Hey Its Parent."); 
    } 
} 

class Derived : Parent 
    { 
    public Derived() { 
    Console.WriteLine("Hey Its Derived."); 
    } 
} 

class OrderOfExecution { 
     static void Main() { 
     Derived obj = new Derived(); 
    } 
} 

這個程序的輸出如下:

嘿其父。

嘿它的派生。

構造函數在繼承位中的作用不同,讓新程序員感到困惑。有在構造 1.呼叫 2.執行 當您創建派生構造函數首先進入派生(命名派生類的一個對象的執行)兩個概念然後它去父()因爲它的呼叫。 調用的構造函數從Bottom to Top完成,但後來發現它首先執行Parent(),然後是Derived,這是因爲它的Execution。 構造函數從頂部到底部執行。這就是爲什麼它首先打印Parent,然後Base基礎構造函數先打印。