Ограничения параметров типа для принципа Лискова в C # .NET - PullRequest
1 голос
/ 15 июля 2009

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

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

   T Clone ();

}

Что я делаю не так?

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

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

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

P.S .: Извините за мой английский, если я допустил ошибки. Я не являюсь носителем английского языка.

1 Ответ

5 голосов
/ 15 июля 2009

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

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

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

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

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

...