c# - 返回抽象类列表

标签 c#

<分区>

Possible Duplicate:
Casting List<T> - covariance/contravariance problem

我有如下定义的类

public abstract class AbstractDType  
{  
     protected abstract string Num1 { get; set; }  
     protected abstract string Num2 { get; set; }  
}

public class AD1 : AbstractDType  
{  
   public string Num1 { get;  set; }  
   public string Num2 { get;  set; }  
   public string Num3 { get; set;  }  
}  

public class AD2 : AbstractDType  
{  
   public string Num1 { get;  set; }  
   public string Num2 { get;  set; }  
   public string Num3 { get; set;  }   
}  

public abstract class DTypeStrategy  
{  
   protected virtual List<AbstractDType> GetData()  
   {  
          return new List<AD1>();  
   }    
}

我想在 GetData() 方法中返回 PD1(具体类型)列表。但是上面的代码抛出了一个转换错误。 List<AbstractDType>无法转换为 List<PD1> .如何修复此错误,以便我可以在 GetData 方法中返回具体内容。

还有其他继承自 DTypeStrategy 的派生类将实现 GetData(),如下所示:(我假设我也会在这里遇到相同的转换错误)

public class MyDraw : DTypeStrategy  
{  
   public override List<AbstractDType> GetData()  
   {  
          return new List <AD2>();  
   } 
}

最佳答案

您在这里的实际目标是什么?如果您真的只想从 GetData 返回一个包含 AD1 的列表,您可以这样做:

protected virtual List<AbstractDType> GetData()  
{  
      var stuff = new List<AbstractDType>();
      stuff.Add( new AD1() );
      return stuff;
} 

但是,如果您真的想返回一个具体类型的列表,那么,您不能这样做——这表明您的设计存在缺陷。想想调用代码如果可能的话:

public void Victim(DTypeStrategy strat)
{
    List<AbstractDType> list = strat.GetData();
    //oops, the list is actually a list<AD1>, so this throws:
    list.Add( new AD2() );
}

问问自己:

  • 为什么我要返回一个专门的列表而不是 AbstractDType 之一?
  • 为什么它应该是一个列表,而不是一个 IEnumerable?

如果出于某种原因必须有一个专门的列表,请使用通用方法:

public class DTypeStrategy<T> where T: AbstractDType
{
    //not sure a concrete here is a good idea, but you get the point...
    public virtual List<T> GetData()
    {
       return new List<T>();
    }
}

public class MyDraw : DTypeStrategy<AD2>
{
   public override List<AD2> GetData()
   {
      return new List<AD2>();
   }
}

如果您不需要 List<T> , 那么你可能会滥用 c# 的 covariant generic interfaces这样做 - 但同样,我会首先查看您的设计。

关于c# - 返回抽象类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5936325/

相关文章:

c# - 如何将 ReadLine 循环重构为 Linq

c# - 反序列化并在所需属性为 null 时抛出异常

c# - 如何针对错误的API响应抛出单个自定义错误消息?

c# - EF 中索引数据注释的错误消息

C#7 模式匹配值不为空

c# - 在 asp.net 中通过 C# 将参数传递给 CRYSTAL REPORTS

c# - 在 C# 中将消息分成更小的 block

c# - Windows Phone 的 Json 序列化

c# - 在标签中显示部分程序的运行时间

c# - 将字符串转换为 Int(不解析)