Как реализовать список интерфейсов [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать список интерфейсов [дубликат]

Сообщение Anonymous »

камрады!
Что не так с кодом ниже?

Код: Выделить всё

public interface IMyListItem
{
}

public interface IMyList
{
IList Items { get; }
}

public class MyListItem : IMyListItem
{
}

public class MyList : IMyList
{
public IList Items { get; } = new List();
}
При компиляции я получаю сообщение об ошибке CS0738. «MyList» не реализует член интерфейса «IMyList.Items». «MyList.Items» не может реализовать «IMyList.Items», поскольку он не имеет соответствующего возвращаемого типа «IList».
Что я пробовал:
Измените класс MyList, как показано ниже:

Код: Выделить всё

public class MyList : IMyList
{
public IList Items { get; } = (IList)new List();
}
но таким образом можно добавить в MyList экземпляр любого IMyListItem, например общедоступного класса AnotherListItem : IMyListItem, и это не соответствует цели.
p>
Далее я попытался объявить IMyList как общий

Код: Выделить всё

public interface IMyList
where T : IMyListItem
{
IList Items { get; }
}
это выглядит немного накладно, но теперь я пишу на машине

Код: Выделить всё

public class MyList : IMyList
{
public IList Items { get; } = new List();
}
и он работает так, как ожидалось.
Двигаемся дальше:
Я хочу добавить в IMyListItem ссылку на экземпляр IMyList , содержащий этот элемент.
Как показано в первой части вопроса, я не могу добавить ссылку таким образом:

Код: Выделить всё

public interface IMyListItem
{
IMyList List { get; }
}
так как я не смогу реализовать это позже, например

Код: Выделить всё

public class MyListItem : IMyListItem
{
public MyList List { get; }
}
// or
public class MyListItem : IMyListItem
{
public IMyList List { get; }
}
поэтому, используя подход с дженериками, я получаю окончательный код, который работает как положено, но выглядит не очень хорошо:

Код: Выделить всё

public interface IMyListItem
where T : IMyListItem
{
IMyList List { get; }
}
public interface IMyList
where T : IMyListItem
{
IList Items { get; }
}

public class MyListItem : IMyListItem
{
public IMyList List { get; } // would like "public MyList List { get; }" instead
}

public class MyList : IMyList
{
public IList Items { get; } = new List();
}
проблемы:
  • Код: Выделить всё

    public interface IMyListItem where T : IMyListItem
    неясно для реализации растушевки.
  • реализовано свойство MyListItem public IMyList List { get; позволяет использовать любую реализацию IMyList, а не только MyList, как ожидалось. Следует изменить на «public MyList List { get; }», но это не соответствует сигнатуре интерфейса.


Подробнее здесь: https://stackoverflow.com/questions/791 ... -interface
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»