抽象类 - 如何指定通用列表的返回

时间:2016-02-25 18:47:44

标签: c# generics abstract-class

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

我想做类似以下的事情,但它不会编译:

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

当然,如果我更换&#34; T&#34;使用&#34; NotifyingDatabaseObject&#34;,它将要求继承类返回该抽象类而不是具体的类。

关于如何实现这一目标的任何方向?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

具体课程类似于:

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

答案 1 :(得分:2)

我假设您希望基类的每个子类都返回{em>特定的子类型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>();
    }
}

请注意,现有答案不会这样做 - 它要求每个子类型都支持返回{em>任何子类型NotifyingDatabaseObject的列表,而不仅仅是一个。{1>}。在这种情况下,唯一可能的实现是返回一个空列表(或null,或抛出异常,或无限循环),因为实现类没有构造类型T的值的一般方法。