2016-07-25 213 views
0

我有一個抽象的泛型類:問題繼承時抽象泛型類

public abstract class A<T> where T : class, new(){ 

    public A (IEnumberable<T>_Data){ 
     this.Data = _Data; 
    } 

    private IEnumerable<T>_data; 
    public IEnumerable<T> Data{ 
     get { return _data; } 
     set { _data = value;} 
    } 

} 

後來,當我繼承類:

public class B<T> : A<T> where T : class, new(){ 

} 

我得到一個錯誤說:

There is not argument that corresponds to the required formal parameter '_Data' of 'A<T>.A(IEnumerable<T>)' 
in the 'B' class. 
+2

什麼是'公共A(_Data)'讓你的基類構造函數的調用?這不會編譯! – user3185569

+0

這是一個構造函數 –

+0

是的,我用手在這裏輸入了代碼。這是一個輸入錯誤。 無論如何解決了它 –

回答

3

您需要繼承A<T>,而不是A

public class B<T> : A<T> where T : class, new(){ 

} 

此外public A(_Data)不是構造函數,我假設你想要。您需要改爲public A<T>(IEnumerable<T> _Data)

最後但並非最不重要的是,您必須爲B創建一個構造函數,它可以調用A中的任何構造函數。因此,要麼定義A一個無參數的構造函數或一個在BIEnumerable<T>作爲參數:

public class B<T> : A<T> where T : class, new() 
{ 
    public B<T>(IEnumerable<T> data) : base(data) { ... } 
} 
+0

我原來的代碼有點複雜,所以我在這裏手工輸入。 我確實繼承了A

+1

然後確保在發佈此問題前提供可驗證的示例。或者適當地編輯它。 – HimBromBeere

1

由於在錯誤說,它不能創建的基類,因爲你沒有提供B.正確的構造改變如果你想通過任何參數

public class B<T> : A<T> where T : class, new(){ 
    public B(IEnumerable<T> data):base(data) { 
    } 
} 

否則,在構造函數中新建你的數據並將其傳遞給base。

1

無論是在你的基類或其他提供公共參數構造函數,建議通過傳遞IEnumberable<T>從派生類