2011-10-31 36 views
0

我試圖做一個類酒吧,它擴展了一個類FooFoo的代碼超出了我的控制範圍。重定向沒有參數的構造函數到參數爲基類的ctor

當有人酒吧的新實例(通過寫類似酒吧X =新的酒吧();)我想這觸發對構造函數的輸入參數的調用。

基本上是:

class Foo { 
    public Foo(string message) { print("The new Foo says: " + message); } 
} 

class Bar : Foo { 
    public Bar() : base(this.GetType()) { } 
} 

所以,當有人使用新的酒吧(),它應該打印出來新富說:酒吧。 (假設有一個print函數,這不是重點。)

相反,C#抱怨,因爲我試圖計算基礎構造函數的參數結果。

請記住,Foo是我無法達到的,所以我不能更改任何代碼在Foo

+1

郵政確切的錯誤信息。這段代碼看起來正確。 –

+1

Foo的確切ctor是什麼? Foo(char [])也許? –

+1

@HenkHolterman,你是對的,我只是編輯了這個問題,因爲我意識到這實際上是一個稍微不同的問題。 – Joe

回答

3

你不能在一個類的構造函數中實際使用前this,因爲只有參數和靜態成員(爲static構造函數之前,任何非靜態的運行),在這種情況下accessable。在您能夠訪問this之前,運行時首先需要構建您繼承的任何類。

作爲一種變通方法,您可以使用typeof操作:

class Bar : Foo { 
    public Bar() : base(typeof(Bar).ToString()) { } 
} 

當然,這是不可移植的,但可能是你將能夠拿出的最好的事情。

+0

似乎要糾正。 –

+0

他在問題中編輯了它。 – Femaref

+0

對不起,我的第一個問題在這裏。 – Joe

1

this.GetType()將不能用作初始化例程。

您不能執行傳遞給基類但依賴於當前實例的代碼。這是合乎邏輯的,因爲基類構造函數首先執行

但是,如果您傳遞類型,則可以使用typeof而不是GetType()

以下代碼運行並正確編譯:

namespace TestNamespace 
{ 
    using System; 

    public class Test 
    { 
     public static void Main() 
     { 
      var foo = new Bar(); 
      Console.ReadKey(); 
     } 
    } 

    class Foo 
    { 
     public Foo(Type type) { Console.WriteLine("The type of Foo is: " + type.ToString()); } 
    } 

    class Bar : Foo 
    { 
     public Bar() : base(typeof(Bar)) { } 
    } 
} 

在執行時,這個打印到控制檯:

的Foo類型的是:TestNamespace.Bar

相關問題