继承类、泛型构造函数出现问题
本文关键字:问题 构造函数 泛型 继承 | 更新日期: 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