gpt4 book ai didi

c# - 继承类、泛型构造函数有问题

转载 作者:行者123 更新时间:2023-11-30 14:36:26 26 4
gpt4 key购买 nike

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

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 是 Not Acceptable 。如果我摆脱了泛型参数,它就起作用了;接受 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>
{ }

关于c# - 继承类、泛型构造函数有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10503121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com