继承类、泛型构造函数出现问题

本文关键字:问题 构造函数 泛型 继承 | 更新日期: 2023-09-27 18:33:43

我有一个半复杂的继承结构,在重写基类上的构造函数时遇到困难。以下代码可以显示错误:

public abstract class MyBaseObject
{
    public MyBaseObject(MyBaseCollection<MyBaseObject> parent)
    {
        this.Parent = parent;
    }
    public MyBaseCollection<MyBaseObject> Parent { get; set; }
}
public abstract class MyBaseCollection<T>
    where T : MyBaseObject
{ }
public class MyRealObject : MyBaseObject
{
    public MyRealObject(MyRealCollection parent)
        : base(parent)
    { }
    public new MyRealCollection Parent { get { return (MyRealCollection)base.Parent; } }
}
public class MyRealCollection : MyBaseCollection<MyRealObject>
{ }

因此,具体来说,我无法重写 MyBaseObject 类中的构造函数。 尝试传入MyRealCollection代替MyBaseCollection是不可接受的。 如果我摆脱泛型参数,它会起作用;MyRealCollection被接受代替MyBaseCollection。 但我真的需要泛型参数来使我的集合类按照我需要的方式工作。

继承类、泛型构造函数出现问题

我建议你研究逆变和协方差。这可能是一个好的开始 http://msdn.microsoft.com/en-us/library/dd799517.aspx

简而言之,CLR 不能假设您希望它在类型继承方面假设的内容,因为一些非常明确的原因远远高于我的工资等级。

但是,如果您稍微使用一下类型层次结构,则可以执行类似操作。我使用IEnumerable来提供帮助。

public abstract class MyBaseObject
{
    public MyBaseObject(IEnumerable<MyBaseObject> parent)
    {
        this.Parent = parent;
    }
    public IEnumerable<MyBaseObject> Parent { get; set; }
}
public class MyRealObject : MyBaseObject
{ 
    public MyRealObject(MyRealCollection parent)
        : base(parent)
    { }
    public new MyRealCollection Parent { get { return (MyRealCollection)base.Parent; } }
}
public class MyRealCollection : IEnumerable<MyRealObject>
{ }

MyRealCollection 不被接受代替 MyBaseCollection,因为它是MyRealObject的集合,而不是MyBaseObject。 为了了解原因,想象一下如果MyBaseObject的构造函数这样做:

public MyBaseObject(MyBaseCollection<MyBaseObject> parent)
{
    this.Parent = parent;
    parent.Add(new SomeOtherRealObject());
}

MyBaseObject的角度来看,这是完全合法的,但如果你通过了MyRealCollection