C# 返回继承类类型列表的基类中的函数

C# 返回继承类类型列表的基类中的函数,c#,C#,假设我有这三门课 class A { protected List<T> MakeList<T>() { return new List<T> } } class B : A { protected void MyFunction() { List<B> = MakeList<B>(); } } class C : A { protected void

假设我有这三门课

class A {

    protected List<T> MakeList<T>() {
        return new List<T>
    }

}

class B : A {

    protected void MyFunction() {
        List<B> = MakeList<B>();
    }

}

class C : A {

    protected void MyFunction() {
        List<C> = MakeList<C>();
    }

}
A类{
受保护列表生成列表(){
返回新列表
}
}
B类:A{
受保护的void MyFunction(){
List=MakeList();
}
}
丙类:甲{
受保护的void MyFunction(){
List=MakeList();
}
}
在我的应用程序中,我永远不需要MakeList()函数返回与调用方类不同的类类型。
是否可以更改A中的MakeList函数以允许B和C在不指定类型的情况下调用它?(例如,只需使用List=MakeList()-调用函数时省略)

您可以将基类设置为泛型:

class A<T> where T : A<T>
{
    protected List<T> MakeList()
    {
        return new List<T>
    }
}

class B : A<B>
{
    protected void MyFunction()
    {
        List<B> x = MakeList();
    }
}

class C : A<C>
{
    protected void MyFunction()
    {
        List<C> x = MakeList();
    }
}
A类,其中T:A
{
受保护列表生成列表()
{
返回新列表
}
}
B类:A
{
受保护的void MyFunction()
{
列表x=MakeList();
}
}
丙类:甲
{
受保护的void MyFunction()
{
列表x=MakeList();
}
}

您可以使基类成为通用类:

class A<T> where T : A<T>
{
    protected List<T> MakeList()
    {
        return new List<T>
    }
}

class B : A<B>
{
    protected void MyFunction()
    {
        List<B> x = MakeList();
    }
}

class C : A<C>
{
    protected void MyFunction()
    {
        List<C> x = MakeList();
    }
}
A类,其中T:A
{
受保护列表生成列表()
{
返回新列表
}
}
B类:A
{
受保护的void MyFunction()
{
列表x=MakeList();
}
}
丙类:甲
{
受保护的void MyFunction()
{
列表x=MakeList();
}
}

在某些时候,您必须告诉它您想要什么类型的列表。您可以将泛型参数移动到类级别,这会使代码看起来像您所要求的那样。但是这个问题很糟糕,我想的是类似List=MakeList()的东西;威奇显然不行。我的函数“知道”我要的是什么类型,它是当前的类类型。我开始认为反思是实现这种行为的唯一途径,但我真的不想以这种方式过度解决问题,我想我可以很高兴地宣布班级类型“两次”。我宁愿认为这应该是一个正确的结构为您的类,也许考虑如果泛型将作出更多。sense@Icepickle是的,你是对的,我将按照建议使用泛型。我开始咬自己的尾巴了。这可能是最好的方法:)在某个时候,你必须告诉它你想要什么类型的列表。您可以将泛型参数移动到类级别,这会使代码看起来像您所要求的那样。但是这个问题很糟糕,我想的是类似List=MakeList()的东西;威奇显然不行。我的函数“知道”我要的是什么类型,它是当前的类类型。我开始认为反思是实现这种行为的唯一途径,但我真的不想以这种方式过度解决问题,我想我可以很高兴地宣布班级类型“两次”。我宁愿认为这应该是一个正确的结构为您的类,也许考虑如果泛型将作出更多。sense@Icepickle是的,你是对的,我将按照建议使用泛型。我开始咬自己的尾巴了。这可能是最好的方法:)我希望得到类似List=MakeList()的东西;但我想我不能:)你为什么要这么做?我停下来想了想我的班级结构,是的,这可能符合我的需要。我开始改变架构。通过这种方式使用泛型,我可以使流保持更线性。它还可以确保编译时类型检查,这是您最终会喜欢的:)我希望类似List=MakeList()的东西;但我想我不能:)你为什么要这么做?我停下来想了想我的班级结构,是的,这可能符合我的需要。我开始改变架构。以这种方式使用泛型可以使流保持更线性。它还可以确保编译时类型检查,这是您最终会喜欢的:)