我设计了我的实体类,以便可以在基类中设置抽象,因为我不想重复相同的代码。然而,在这样做的过程中,我已经达到了一个目的,我想要引用超类'泛型集合指向子类类型集合,但它吐出编译器错误。请参考下面的类骷髅,并建议我应该如何重新设计或解决问题,以便在测试方法中我不会收到任何错误。
请注意,如果您的解决方案是像我在baseRef3中所做的那样,那么这不是我想要的。我希望基类集合类引用指向类型化的子类集合对象。
public interface IEntity
{
}
public class BaseEntity : IEntity
{
}
public abstract class BaseEntityCollection<T> : List<T>
where T : BaseEntity, new()
{
}
public class RealEntity : BaseEntity
{
}
public class RealEntityCollection : BaseEntityCollection<RealEntity>
{
}
public static void Test()
{
//Gives compile time error on both of below lines
BaseEntityCollection<BaseEntity> baseRef1 = new RealEntityCollection();
BaseEntityCollection<BaseEntity> baseRef2 = (BaseEntityCollection<RealEntity>)(new RealEntityCollection());
//Following works with RealEntity in the refence but I do not want to keep ref to subtype rather base
BaseEntityCollection<RealEntity> baseRef3 = new RealEntityCollection();
}
由于
编辑:我使用的是.NET 3.5,因此不确定是否支持Generics协方差。任何帮助高度赞赏!我将设计简化为以下内容:
public interface IEntity
{
}
public class BaseEntity : IEntity
{
}
public class RealEntity : BaseEntity
{
}
public class RealEntityCollection : IEnumerable<RealEntity>
{
}
但是以下两行仍然会给出编译器错误:
IEnumerable<BaseEntity> baseRef1 = new RealEntityCollection();
IEnumerable<IEntity> baseRef2 = new List<RealEntity>();
然而,以下两个正在发挥作用:
IEnumerable<BaseEntity> baseRef3 = (IEnumerable<BaseEntity>)(new List<RealEntity>());
IEnumerable<IEntity> baseRef4 = (IEnumerable<IEntity>)(new List<RealEntity>());
实际上我不想让铸造耗费时间,所以上述两条线路看起来并不理想。有没有其他方法可以在.NET 3.5中解决这个问题?
答案 0 :(得分:0)
BaseEntityCollection<RealEntity>
不是BaseEntityCollection<BaseEntity>
。否则你可以这样做:
BaseEntityCollection<BaseEntity> baseRef1 = new RealEntityCollection();
baseRef1.Add(new OtherRealEntity());
除非您更改BaseEntityCollection<T>
的定义以使用像IEnuemerable<T>
这样的协变接口,否则无法转换/转换/伪造编译器。