【问题标题】:How to create a list of an abstract generic class? [duplicate]如何创建抽象泛型类的列表? [复制]
【发布时间】:2011-08-26 22:12:21
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 你的话是list,但你的代码是array。是哪一个,你认为你可以用你当前的代码描述问题吗?
  • 我的意思是 List 并从该列表中获取属性 Results
  • @Oscar:你想创建一个List&lt;ProblemBase&lt;TResult&gt;&gt;吗?你可以这样做,没问题...

标签: c# oop interface


【解决方案1】:

我不完全理解您的问题(ProblemBase 列表?在哪里?)但我猜您的问题可能是您不能“新建”一个 ProblemBase 对象。这是因为类是抽象的。

根据您的其他问题,我猜您想要收集某种此类 ProblemBase,但具有不同的通用参数。

当您实施 IProblem-Interface 时,我建议您使用它来创建 IProblem-collection。如果您需要每个结果的结果,而不是将 tResult 约束到一个接口(比如 IResult),您甚至可以这样做。

【讨论】:

    【解决方案2】:

    我想你是在问如何创建一个通用接口,也许?

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

    【讨论】:

      【解决方案3】:

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

      例如,

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我认为您正在寻找的术语是“协变”和“逆变”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 2018-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多