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

本文关键字:抽象 泛型类 列表 创建 何创建 | 更新日期: 2023-09-27 18:06:59

可能重复:
如何拥有ProblemBase<TResult>?

我使用的是泛型类型。我的问题是,我需要一个ProbemBase列表并获取Results属性,这可能吗?或者可以采取什么措施来解决这个问题?

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

感谢

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

我不完全理解您的问题(ProbemBase列表?在哪里?(,但我想您的问题可能是无法"新建"ProbemBase对象。这是因为这个类是抽象的。

根据你的另一个问题,我想你想要一个这个问题库的集合,但有不同的通用参数。

当你实现IProblem接口时,我建议你用它来制作一个IPproblem集合。如果你需要每个的Results,那么也可以将tResult约束到一个接口(比如IResult(,你甚至可以这样做。

我想您可能在问如何创建通用接口?

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

不能直接创建抽象类型的实例,必须定义从抽象类型派生的新(非抽象(类型。然后实例化它。然后,您可以将这些项目添加到您的列表/数组/集合/任何内容中。

例如

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

下面列出了不使用通用接口的唯一方法,请注意,我建议您用一个更抽象的对象来更改数组:IEnumerable(然后在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;  } }
}