Похоже, что C# 4.0 не поддерживает ковариацию (используя ключевое слово «in») по параметрам в переопределениях; что дело?Есть ли более элегантный способ сделать это в .NET 4.0?
Если да, есть ли более элегантный способ сделать это?
КОНТЕКСТ
public interface IBaseEvent { /* ... */ }
public interface IDerivedEvent : IBaseEvent { /* ... */ }
public class MoreDerivedEvent : IDerivedEvent { /* ... */ }
У меня есть набор классов, которые обрабатывают MoreDerivedEvent
. Из-за ограничений кода обработки событий я могу зарегистрировать только один обработчик событий для MoreDerivedEvent
, и я не знаю, что он будет обрабатывать регистрацию интерфейсов как событий (я не верю, что это будет, поскольку руководство должно использовать классы явно). Итак, для того, чтобы обрабатывать события надлежащим образом, я определил обработчики следующим образом:
public class BaseType
{
protected virtual void Handle(IBaseEvent @event) { /* Do Base Stuff */ }
}
public class DerivedType
{
protected virtual void Handle(IDerivedEvent @event)
{
/* Do Derived Stuff */
Handle((IBaseEvent)@event);
}
protected override sealed void Handle(IBaseEvent @event)
{
base.Handle(@event);
}
}
Это, очевидно, не дает истинного наследство, и я, вероятно, просто сплющить типы получены из DerivedType
и BaseType
, если я не может решить эту проблему. Но я решил, что сначала поставлю его в сообщество переполнения стека.
Спасибо за исправление в сравнении с контравариантностью; Я обновил вопрос и теги. – arootbeer