2014-01-17 76 views
0

我有一段代碼堆棧溢出異常,無法找到原因

public class A 
    { 
     public A() 
     { 
      Console.WriteLine("A"); 
     } 
     B b = new B("From A"); 
    } 
    public class B : A 
    { 
     public B() 
     { 
      Console.WriteLine("B"); 
     } 
     public B(string str) //Getting exception here 
     { 
      Console.WriteLine("In B " + str); 
     } 
    } 
    public class C : A 
    { 
     B b = new B("From C"); 
     public C() 
     { 
      Console.WriteLine("C"); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      new C(); 
      Console.ReadKey(); 
     } 
    } 

在這裏,我知道,所有的屬性都被初始化稱爲基本構造第一之前,但我找不到爲什麼我收到#1例外。任何幫助?感謝

回答

10

由於B,從A繼承,它繼承了

B b = new B("From A"); 

字段。所以,無論何時創建B對象,它都會在無限遞歸鏈中創建另一個B對象。

因此,在實際的程序中,您創建了一個C對象。然後使用帶字符串的重載(「From C」)構造一個B對象。然後,您會在該構造函數上得到一個異常,因爲它會遞歸地創建無限B對象。

+0

哦!你是對的。我多麼想念那謝謝 –

4

遞歸無限循環:

  • 創建A B每一次,你創建一個新的A(通過繼承)。
  • 每次創建A時,都會創建一個新的B(通過變量b)。
0

由於B從A

//公共B類繼承:一個

而當你在A級創建B的對象,它會在遞歸無限循環

+0

已經在下面回答。 –

0

上面的問題是由於循環實例化。

這裏我們對實例化的思考會導致這些問題: 在這裏,當我們實例化C時,我們只是沒有得到類C的對象,但實際上它是C + B + A的組合。

這些類型的問題可以很容易地通過使用箭頭從實例化對象到實例化對象繪製對象圖來識別。