C# 抽象类——如何指定泛型列表的返回

C# 抽象类——如何指定泛型列表的返回,c#,generics,abstract-class,C#,Generics,Abstract Class,我在这方面有些困难。我有一个抽象类,我想为它的继承者添加一个公共抽象方法来实现。挑战在于该方法应该返回实现完全不同的抽象类(NotifyingDatabaseObject)的类的通用列表 我想执行以下操作,但无法编译: public abstract IList<T> GetList(int? id) where T : NotifyingDatabaseObject; 公共抽象IList GetList(int?id),其中T:NotifyingDatabaseObject;

我在这方面有些困难。我有一个抽象类,我想为它的继承者添加一个公共抽象方法来实现。挑战在于该方法应该返回实现完全不同的抽象类(NotifyingDatabaseObject)的类的通用列表

我想执行以下操作,但无法编译:

public abstract IList<T> GetList(int? id) where T : NotifyingDatabaseObject;
公共抽象IList GetList(int?id),其中T:NotifyingDatabaseObject;
当然,如果我将“T”替换为“NotifyingDatabaseObject”,它将要求继承类返回抽象类而不是具体类

我如何才能做到这一点,有什么方向吗


谢谢

如果返回的类型与抽象类或具体类无关,则可以在方法上使用类型参数,如:

public abstract IList<T> GetList<T>(int? id) where T : NotifyingDatabaseObject;
公共抽象IList GetList(int?id),其中T:NotifyingDatabaseObject;
具体类将类似于:

class MyConcreteClass : MyAbstractClass
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList<NotifyingDatabaseObjectChild>(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}
class MyConcreteClass:MyAbstractClass
{
公共覆盖IList GetList(int?id)
{
返回新列表();
}
}

如果返回的类型与抽象类或具体类无关,则可以在方法上使用类型参数,如:

public abstract IList<T> GetList<T>(int? id) where T : NotifyingDatabaseObject;
公共抽象IList GetList(int?id),其中T:NotifyingDatabaseObject;
具体类将类似于:

class MyConcreteClass : MyAbstractClass
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList<NotifyingDatabaseObjectChild>(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}
class MyConcreteClass:MyAbstractClass
{
公共覆盖IList GetList(int?id)
{
返回新列表();
}
}

我假设您希望基类的每个子类都返回一个特定的子类型
NotifyingDatabaseObject
。在这种情况下,您应该向基类添加一个类型参数,并让每个子类型指定它们返回的
NotifyingDatabaseObject
的哪个子类型:

public abstract class MyAbstractClass<T>
    where T : NotifyingDatabaseObject
{
    public abstract IList<T> GetList(int? id) ;
}

public class MyConcreteClass : MyAbstractClass<NotifyingDatabaseObjectChildClass>
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}
公共抽象类MyAbstractClass
其中T:NotifyingDatabaseObject
{
公共抽象IList GetList(int?id);
}
公共类MyConcreteClass:MyAbstractClass
{
公共覆盖IList GetList(int?id)
{
返回新列表();
}
}

请注意,现有答案不支持此操作-它要求每个子类型都支持返回
NotifyingDatabaseObject
的任何子类型的列表,而不仅仅是一个特定的子类型。在这种情况下,唯一可能的实现是返回空列表(或null,或抛出异常,或无限循环),由于实现类没有构造类型为
T

的值的通用方法,我假设您希望基类的每个子类都返回一个特定的
NotifyingDatabaseObject
子类型。在这种情况下,您应该向基类添加一个类型参数,并让每个子类型指定它们返回的
NotifyingDatabaseObject
的哪个子类型:

public abstract class MyAbstractClass<T>
    where T : NotifyingDatabaseObject
{
    public abstract IList<T> GetList(int? id) ;
}

public class MyConcreteClass : MyAbstractClass<NotifyingDatabaseObjectChildClass>
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}
公共抽象类MyAbstractClass
其中T:NotifyingDatabaseObject
{
公共抽象IList GetList(int?id);
}
公共类MyConcreteClass:MyAbstractClass
{
公共覆盖IList GetList(int?id)
{
返回新列表();
}
}

请注意,现有答案不支持此操作-它要求每个子类型都支持返回
NotifyingDatabaseObject
的任何子类型的列表,而不仅仅是一个特定的子类型。在这种情况下,唯一可能的实现是返回一个空列表(或null,或抛出一个异常,或无限循环),因为实现类没有构造类型为
T

的值的通用方法(编译并测试!)唯一的缺点是调用方法时必须再次传递类型:
var mylist=concrete.GetList(10)这是因为它无法从用法推断类型。谢谢-这似乎工作得很好!我必须返回并再次阅读泛型手册。好的,这将编译,但这不是目的,因为
NotifyingDatabaseObjectChild
是一个类型参数,而不是具体类型。在这种情况下,返回空列表是唯一可能的实现,因为实现者没有关于
T
的其他信息。在这种情况下,您不妨将实现移到基类。他从未说过返回的类型应该是具体的:
方法应该返回实现完全不同的抽象类的类的通用列表,但是,如果是这样,我们可以将约束添加到抽象类:
where T:NotifyingDatabaseObject,new()此重写版本所做的任何事情都不能在基类中完成。这种方法只有在OP希望每个子类执行不同的泛型构造时才有效,这是极不可能的。编译并测试!;)唯一的缺点是调用方法时必须再次传递类型:
var mylist=concrete.GetList(10)这是因为它无法从用法推断类型。谢谢-这似乎工作得很好!我必须返回并再次阅读泛型手册。好的,这将编译,但这不是目的,因为
NotifyingDatabaseObjectChild
是一个类型参数,而不是具体类型。在这种情况下,返回空列表是唯一可能的实现,因为实现者没有关于
T
的其他信息。在这种情况下,您不妨将实现移到基类。他从未说过返回的类型应该是具体的:
方法应该返回实现完全不同的抽象类的类的通用列表,但是,如果是这样,我们可以将约束添加到抽象类:
where T:NotifyingDatabaseObject,new()此重写版本所做的任何事情都不能在基类中完成。这种方法只有在OP希望每个子类执行不同的泛型构造时才有效,这是极不可能的。你是对的,它确实需要返回特定的子类型。让我上厕所