如何创建抽象泛型类的列表?

时间:2011-08-26 22:12:22

标签: c# oop interface

  

可能重复:
  How to have a list of ProblemBase<TResult>?

我正在使用通用类型。我的问题是我需要有一个ProblemBase列表并获得Results属性,这可能吗?或者可以做些什么来解决这个问题?

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

由于

4 个答案:

答案 0 :(得分:0)

我不完全理解你的问题(问题基础列表?在哪里?)但我想你的问题可能是你不能“新” - 一个问题基础对象。这是因为这个类是抽象的。

根据你的其他问题,我猜你想要一个这个问题基础的集合,但有不同的通用参数。

当您实现IProblem-Interface时,我建议您使用它来制作IProblem-collection。如果您需要每个结果,那么也可以将tResult约束到接口(比如IResult),你甚至可以做到这一点。

答案 1 :(得分: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; }
}

答案 2 :(得分:0)

下面列出了不使用泛型接口的唯一方法,注意我建议你用一个更抽象的对象来改变数组:IEnumerable(然后你在C#4上协方差和逆变你的代码)。另一种方法可以使用通用接口,如IProblem&lt;&gt;

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

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

答案 3 :(得分:0)

您无法直接创建抽象类型的实例,您必须定义从抽象类型派生的新(非抽象)类型。然后实例化。然后,您可以将这些项添加到list / array / collection / whatever。

如,

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
};