基础/派生类型泛型参数

时间:2013-03-02 13:48:32

标签: c# generics

我想在抽象类和方法签名中有一个抽象方法,如下所示:

public abstract IEnumerable<SynchronizeItem<IDataItem>> Sync(IEnumerable<SynchronizeItem<IDataItem>> clientSyncItems);

在派生类中,我想定义方法类型安全性:

public override IEnumerable<SynchronizeItem<AdItem>> Sync(IEnumerable<SynchronizeItem<AdItem>> clientSyncItems)
{
    // Do something with the AdItems
    _adHandler.Foo(clientItems):
}

这是不可能的。任何其他可能实现相同的行为?我不想将IDataItem的每个用法转换为AdHandler类中的特定实现。

2 个答案:

答案 0 :(得分:2)

尝试定义您的抽象方法,如:

public  IEnumerable<SynchronizeItem<T>> Sync<T>(IEnumerable<SynchronizeItem<T>> clientSyncItems)  where T : IDataItem;

您的其他方法,即实施,是正确的。

答案 1 :(得分:1)

Renen的答案不会完全符合您的要求,因为在我看来,您希望子类定义具体类型,而不是调用者。为此,请将type参数作为基类的一部分,而不是方法:

public class Base<T> where T : IDataItem
{
    public abstract IEnumerable<SynchronizeItem<T>> Sync(
        IEnumerable<SynchronizeItem<IDataItem>> 
        clientSyncItems);
}

你的派生类:

public class Derived : Base<AdItem>
{
    public override IEnumerable<SynchronizeItem<AdItem>> Sync(
        IEnumerable<SynchronizeItem<AdItem>> 
        clientSyncItems) 
    { ... }
}