Ограничения параметров типа для принципа Лискова в C#.NET

Я пытаюсь создать универсальный интерфейс, который наследует интерфейс System.ICloneable, но где возвращаемый тип метода Clone()- это T. Конечно, T-тип нуждается в ограничениях, чтобы быть уверенным, что это наследование класса System.Object, но следующий код не работает.

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}

Что я делаю неправильно?

Также не работают следующие ограничения:

  1. где T: System.Object
  2. где Т: класс

как я могу использовать принцип Лискова в этом случае, который говорит, что вы можете сузить свой тип возвращаемого значения, чтобы решить эту проблему?

PS: извините за мой английский, если я сделал ошибки. Я не носитель английского языка.

1 ответ

Решение

Зачем вам вообще нужно ограничение? Все наследует от object...

Без ограничений ваш код должен работать, но вам нужно будет реализовать оба Clone методы так же, как IEnumerable/IEnumerable<T> работа - .NET не имеет ковариантных типов возврата. Вы также должны указать, что ваш Clone метод скрывает один в ICloneable:

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}

Обратите внимание, что текущий ICloneable интерфейс несколько устарел - поскольку он не дает указаний на глубину клонирования, в большинстве случаев он не очень полезен.

Вам действительно нужно расширять неуниверсальный тип? Ожидаете ли вы, что пользователи захотят использовать не универсальный интерфейс, а также ваш общий?

Другие вопросы по тегам