2011-08-26 72 views
-1

可能重複:
How to have a list of ProblemBase<TResult>?如何創建一個抽象泛型類的列表?

我使用一個通用的類型。我的問題是我需要有一個ProblemBase列表並獲得Results屬性,這可能嗎?或者可以做些什麼來解決這個問題?

public abstract class ProblemBase<TResult> : IProblem 
{ 
    public TResult[] Results { get; set; } 
} 

感謝

+0

你說的話'list'但你的代碼說'array'。這是什麼,你認爲你可以用當前的代碼來描述問題嗎? –

+0

我的意思是,列表並從該列表中獲取結果 – Darf

+0

@Oscar:您是否在嘗試創建一個List >?你可以做到這一點,沒問題... –

回答

0

我不完全理解你的問題(ProblemBase列表?在哪裏?),但我猜你的問題可能是,你不能「新」 - 最多一個ProblemBase對象。這是因爲課程是抽象的。

根據你的其他問題,我想你想要一個這種ProblemBase的集合,但具有不同的通用參數。

由於您實施了IProblem-Interface I sugguest,因此您可以使用它來創建IProblem集合。如果你需要每個結果而不是限制tResult到一個接口(比如IResult),你甚至可以做到這一點。

0

我想你是問如何創建一個通用接口,也許?

public interface IProblem<T> 
{ 
    IList<T> Results { get; set; } // maybe even only a get; ? 
} 

public abstract class ProblemBase<T> : IProblem<T> 
{ 
    public IList<T> Results { get; set; } 
} 
0

不使用通用接口的唯一方法是在下面列出,請注意我建議你改變陣列更爲抽象的對象:IEnumerable的(然後你laverage協方差和逆變於C#4你的代碼)。另一種方法可以使用通用的接口,如IProblem <>

public abstract class ProblemBase<TResult> : IProblem 
{ 
    public IEnumerable<TResult> Results { get; set; } 

    IEnumerable IProblem.Results { get { return this.Results; } set { this.Results = value; } } 
} 
+1

我認爲你正在尋找的術語是「協方差」和「逆變」。 –

0

您不能直接創建一個抽象類型的實例,你必須定義一個新的(非抽象),鍵入您的抽象類型派生。然後實例化。然後你可以將這些項目添加到你的列表/數組/集合/任何。

例如,

public class MathProblem : ProblemBase<double> 
{ 
} 

var list = new List<IProblem> // better to be a list of the common interface 
{ 
    new MathProblem(), // now we can add to the list 
};