Ограничения параметров типа для принципа Лискова в C#.NET
Я пытаюсь создать универсальный интерфейс, который наследует интерфейс System.ICloneable, но где возвращаемый тип метода Clone()- это T. Конечно, T-тип нуждается в ограничениях, чтобы быть уверенным, что это наследование класса System.Object, но следующий код не работает.
public interface ICloneable<T> : System.ICloneable where T : object {
T Clone ();
}
Что я делаю неправильно?
Также не работают следующие ограничения:
- где T: System.Object
- где Т: класс
как я могу использовать принцип Лискова в этом случае, который говорит, что вы можете сузить свой тип возвращаемого значения, чтобы решить эту проблему?
PS: извините за мой английский, если я сделал ошибки. Я не носитель английского языка.
1 ответ
Зачем вам вообще нужно ограничение? Все наследует от object
...
Без ограничений ваш код должен работать, но вам нужно будет реализовать оба Clone
методы так же, как IEnumerable
/IEnumerable<T>
работа - .NET не имеет ковариантных типов возврата. Вы также должны указать, что ваш Clone
метод скрывает один в ICloneable
:
public interface ICloneable<T> : ICloneable
{
new T Clone();
}
Обратите внимание, что текущий ICloneable
интерфейс несколько устарел - поскольку он не дает указаний на глубину клонирования, в большинстве случаев он не очень полезен.
Вам действительно нужно расширять неуниверсальный тип? Ожидаете ли вы, что пользователи захотят использовать не универсальный интерфейс, а также ваш общий?