2012-08-28 23 views
1

爲什麼這是不可能的?爲什麼我們不能在派生類中使用帶參數的構造函數

「GenericParameterizedConstructor.DerivedClass」不包含一個構造函數參數1

但調用一個非常類似的方法作品: 我實例化時「DerivedClass」與構造函數參數得到下面的編譯器錯誤。

爲什麼?

class Program 
{ 
    static void Main(string[] args) 
    { 
     // This one produces a compile error 
     // DerivedClass cls = new DerivedClass("Some value"); 

     // This one works; 
     DerivedClass cls2 = new DerivedClass(); 
     cls2.SomeMethod("Some value"); 
    } 
} 


public class BaseClass<T> 
{ 
    internal T Value; 

    public BaseClass() 
    { 
    } 

    public BaseClass(T value) 
    { 
     this.Value = value; 
    } 

    public void SomeMethod(T value) 
    { 
     this.Value = value; 
    } 
} 

public class DerivedClass : BaseClass<String> 
{ 
} 

回答

5

構造函數不是繼承的 - 就這麼簡單。 DerivedClass包含一個構造函數 - 編譯器默認提供的公共無參數構造函數,因爲您沒有指定任何構造函數。

請注意,這有什麼也沒有與泛型。如果BaseClass不是通用的,你會看到同樣的情況。

這很容易DerivedClass提供構造雖然:

public class DerivedClass : BaseClass<String> 
{ 
    public DerivedClass() : base() 
    { 
    } 

    public DerivedClass(string value) : base(value) 
    { 
    } 
} 
+0

謝謝。你是對的。讓我誤解的是,Base類的無參構造函數在實例化DerivedClass時總是被調用 - 即使DerivedClass中存在無參數構造函數。 –

0

的派生類需要公開的構造

public class DerivedClass : BaseClass<String> 
{ 
    public DerivedClass(string str) :base(str) {} 
} 
0

它有時會有所幫助,如果有指示編譯器的方式爲特定的派生類自動生成構造函數,這些構造函數精確地模仿和包裝所有基類。然而,默認情況下會出現這種行爲,這會造成問題。許多派生類期望他們的一些代碼將在其類型的實例被創建時被調用。假設一個父類有兩個構造函數:

 
parentType(int foo) {...} 
parentType(string foo) {...} 

和派生類型有一個:

 
derivedType(string foo) {...} 

應該是什麼的new derivedType(7);的影響?編譯器會知道如何創建一個new baseType(7);,但如果它創建了一個新的「空白」derivedType對象,然後簡單地調用父類型構造函數,則結果將爲derivedType對象,該對象從未運行過任何derivedType的構造代碼。雖然有些類不會有任何問題(對於這樣的類,前面提到的假設特徵會有幫助),但很多類都會有幫助。

順便說一句,與受保護的構造函數有關的問題。在某些.net語言中,包括至少當前版本的C#,如果非抽象類型Foo定義了一個受保護的構造函數,則該構造函數只能用於創建派生類型的實例。在其他語言(包括當前的vb.net)中,派生類型中的代碼可能會調用基類型的受保護構造函數以創建新的基類型實例。

相關問題