2013-03-02 2 views
1

Я хотел бы иметь абстрактный метод внутри абстрактного класса и метод подписи, как это:Base/Выводятся Тип Дженерик Параметр

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.

ответ

1

ответ Renen не будет делать совсем то, что вы хотите, как это кажется мне, что вы хотите подкласса определить конкретный тип, а не вызывающих. Чтобы сделать это, сделать аргумент типа часть базового класса, а не метод:

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) 
    { ... } 
} 
2

Попробуйте определить свой абстрактный метод, как:

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

другой Ваш метод, реализация, является правильным.

Смежные вопросы