у меня есть набор интерфейсов, который выглядит следующим образом:ковариации в общих интерфейсов в C# .NET
interface IBaseItem { }
interface IDerivedItem : IBaseItem { }
class Item : IDerivedItem { }
interface IBaseContainer<out TItem>
where TItem : IBaseItem
{
TItem Item { get; }
}
interface IDerivedContainer<out TItem> : IBaseContainer<TItem>
where TItem : IDerivedItem
{ }
class Container<TItem> : IDerivedContainer<TItem>
where TItem : IDerivedItem
{
public TItem Item
{
get { return default(TItem); }
}
}
interface IMyContainer : IBaseContainer<IBaseItem> { }
class MyContainer : Container<Item>, IMyContainer { }
И когда я пытаюсь скомпилировать, что компилятор говорит: «MyContainer» не реализует элемент интерфейса ' IBaseContainer.Item. «Container.Item» не может реализовать «IBaseContainer.Item», потому что у него нет соответствующего типа возврата «IBaseItem».
Так что мой вопрос: не должен ли контейнер контейнера IBaseContainer, поскольку он реализует IBaseContainer, что эквивалентно IBaseContainer по ковариации? Или у меня что-то не так?
Зачем вам нужно реализовать 'IMyContainer', если' Container- 'уже является конкретной реализацией' IDerivedContainer'? Интерфейс 'IMyContainer' заставит вас использовать' public IBaseItem Item {get; } ', который скроет' public IDerivedItem Item {get; } ' –
' IMyContainer' будет публичным интерфейсом, который будет использоваться в другой части решений, и позже он будет иметь другие свойства. И, кроме того, мой IDerivedItem будет иметь свойства, которые должны иметь только некоторые разработчики. –
Затем вам нужно решить проблему наличия двух объектов «Предмет» в одной и той же конкретной реализации. –