我对此有些困难。我有一个抽象类,我想为其继承者添加一个公共抽象方法来实现。挑战在于该方法应返回实现完全不同的抽象类(NotifyingDatabaseObject)的类的通用列表。
我想做类似以下的事情,但它不会编译:
public abstract IList<T> GetList(int? id) where T : NotifyingDatabaseObject;
当然,如果我更换&#34; T&#34;使用&#34; NotifyingDatabaseObject&#34;,它将要求继承类返回该抽象类而不是具体的类。
关于如何实现这一目标的任何方向?
谢谢!
答案 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
的值的一般方法。