Abstract Class -- 如何指定泛型列表return

Abstract Class -- How to specify return of generic list

我遇到了一些困难。我有一个抽象class,我想添加一个public抽象方法供其继承者实现。挑战在于该方法应该 return 实现完全不同的抽象 class (NotifyingDatabaseObject) 的 classes 的通用列表。

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

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

而且,当然,如果我用 "NotifyingDatabaseObject" 替换 "T",它将需要继承 classes 到 return,而不是抽象 class具体的。

关于如何完成此操作的任何方向?

谢谢!

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

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

具体的 class 应该是这样的:

class MyConcreteClass : MyAbstractClass
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList<NotifyingDatabaseObjectChild>(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}

我假设你希望你的基础 class 的每个子 class 到 return NotifyingDatabaseObject 特定 子类型。在这种情况下,您应该向基础 class 添加一个类型参数,并让每个子类型指定 NotifyingDatabaseObject 的子类型 return:

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>();
    }
}

请注意,现有答案不会这样做 - 它要求每个子类型支持 returning NotifyingDatabaseObjectany 子类型的列表,而不仅仅是特别是一个。在这种情况下,唯一可能的实现是 return 一个空列表(或 null,或抛出异常,或无限循环),因为实现 classes 没有构造类型值的通用方法T.