1

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

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 类中的特定实现。

4

2 回答 2

2

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

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

您的另一种方法,即实现,是正确的。

于 2013-03-02T13:52:26.977 回答
1

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

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) 
    { ... }
}
于 2013-03-02T14:59:07.453 回答