C# 如何继承列表<&燃气轮机;作为列表的基本对象的数量<&燃气轮机;派生对象的定义?

C# 如何继承列表<&燃气轮机;作为列表的基本对象的数量<&燃气轮机;派生对象的定义?,c#,list,inheritance,C#,List,Inheritance,是否可以将基础对象列表继承为派生对象列表?不知道如何更好地解释它。希望这个例子能说明: public abstract class MyBase { } public class MyConcrete: MyBase { } public abstract class MyBases: IList<MyBase> { internal abstract List<MyBase> Items { get; set; } public MyBase thi

是否可以将基础对象列表继承为派生对象列表?不知道如何更好地解释它。希望这个例子能说明:

public abstract class MyBase
{ }

public class MyConcrete: MyBase
{ }

public abstract class MyBases: IList<MyBase>
{
    internal abstract List<MyBase> Items { get; set; }
    public MyBase this[int index] { get => ((IList<MyBase>)Items)[index]; set => ((IList<MyBase>)Items)[index] = value; }

    // other implementations of IList...
}

public class MyConcretes: MyBases
{
    //Possible:
    internal override List<MyBase> Items { get; set; }

    // Needed
    internal override List<MyConcrete> Items { get; set; }
}
公共抽象类MyBase
{ }
公共类MyConcrete:MyBase
{ }
公共抽象类MyBase:IList
{
内部抽象列表项{get;set;}
public MyBase this[int index]{get=>((IList)Items)[index];set=>((IList)Items)[index]=value;}
//IList的其他实现。。。
}
公共类MyConcretes:mybase
{
//可能的:
内部重写列表项{get;set;}
//需要
内部重写列表项{get;set;}
}

您可以使用模板类

public abstract class MyBases<T> : IList<T>
{
    internal abstract List<T> Items { get; set; }
    public MyBase this[int index] { get => ((IList<MyBase>)Items)[index]; set => ((IList<MyBase>)Items)[index] = value; }

    // other implementations of IList...
}

public class MyConcretes : MyBases<MyConcrete>
{
    internal override List<MyConcrete> Items { get; set; }
}
公共抽象类mybase:IList
{
内部抽象列表项{get;set;}
public MyBase this[int index]{get=>((IList)Items)[index];set=>((IList)Items)[index]=value;}
//IList的其他实现。。。
}
公共类MyConcretes:mybase
{
内部重写列表项{get;set;}
}

您可以使用模板类

public abstract class MyBases<T> : IList<T>
{
    internal abstract List<T> Items { get; set; }
    public MyBase this[int index] { get => ((IList<MyBase>)Items)[index]; set => ((IList<MyBase>)Items)[index] = value; }

    // other implementations of IList...
}

public class MyConcretes : MyBases<MyConcrete>
{
    internal override List<MyConcrete> Items { get; set; }
}
公共抽象类mybase:IList
{
内部抽象列表项{get;set;}
public MyBase this[int index]{get=>((IList)Items)[index];set=>((IList)Items)[index]=value;}
//IList的其他实现。。。
}
公共类MyConcretes:mybase
{
内部重写列表项{get;set;}
}

C的方差规则不允许您使用
List
执行此操作,因为
T
同时显示为输入和输出。如果改用
IReadOnlyList
,您可能会得到一些有用的东西,这(我相信)在
T
@MikeStrobel上是协变的,所以我唯一的可能就是使用“MyBase”并每次强制转换它?您可以让您的类成为泛型来处理这个问题。作为补充说明,您不应该继承IList,实际上您很少需要扩展列表的功能,您可能只想将列表作为内部成员保留。如果有人找到更好的标题措辞,请更改。@MikeStrobel:没错;它是协变的。C#的方差规则不允许您对
List
执行此操作,因为
T
同时显示为输入和输出。如果改用
IReadOnlyList
,您可能会得到一些有用的东西,这(我相信)在
T
@MikeStrobel上是协变的,所以我唯一的可能就是使用“MyBase”并每次强制转换它?您可以让您的类成为泛型来处理这个问题。作为补充说明,您不应该继承IList,实际上您很少需要扩展列表的功能,您可能只想将列表作为内部成员保留。如果有人找到更好的标题措辞,请更改。@MikeStrobel:没错;这是协变的,我不认为这是你想要的。如果T不是
MyBase
,则将
列表
强制转换为
IList将生成运行时错误。T应该派生自MyBase,而不是IList。我认为这不是您想要的。如果T不是
MyBase
,则将
列表
强制转换为
IList将生成运行时错误。T应派生自MyBase,而不是IList。