2016-02-25 31 views
0

我有一些困难,这个回报。我有一个抽象类,我想为它的继承者添加一个公共抽象方法来实现。面临的挑战是该方法应该返回一个实现完全不同的抽象类(NotifyingDatabaseObject)的类的通用列表。抽象类 - 如何指定泛型列表

我想这样做以下,但它不会编译:

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

,当然,如果我取代“T”与“NotifyingDatabaseObject”,它会要求继承类返回抽象类而不是具体的类。

我如何能做到这一点的任何方向?

谢谢!

回答

2

我想,你希望你的基类的每个子类返回的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>(); 
    } 
} 

注意现有的回答没有做到这一点 - 它要求每个亚型支持返回一个列表的任何亚型NotifyingDatabaseObject,不只是一个特别。在这种情况下,唯一可能的实现是返回一个空列表(或null,或抛出异常,或无限循环),因为实现类没有构造T类型值的一般方法。

+0

你是对的 - 它确实需要返回一个特定的子类型。让我看看这个,我会根据需要修改一些东西。谢谢! – DPH

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

这不会编译。 – Lee

+0

编译并测试! ;)唯一的缺点是具有再次传递类型调用方法时:'VAR MYLIST = concrete.GetList (10);'这是因为它不能推断从使用的类型。 –

+0

谢谢 - 这似乎工作得很好!我将不得不跑回去阅读泛型手册。 – DPH