Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Почему метод, реализующий интерфейс, не может возвращать дочерний объект?

Допустим есть класс А, реализующий интерфейс I interface I { } class A : I { } Теперь сделаем интерфейс с функцией foo, возвращающей I interface IGetter { I foo(); } И попытаемся его реализовать. class Getter : IGetter { public A foo() { return new A(); } } На что получим ошибку компиляции мол «класс Getter не реализует интерфейс IGetter». И пойдём писать явную реализацию интерфейса, являющуюся обёрткой вызова foo() I IGetter.foo() { return foo(); } Но зачем это? С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? UPD: вопрос сугубо о причине описанного запрета. Пожалуйста, не предлагайте способы его обойти, их я и сам могу придумать с десяток.


Ответ

С какой целью стандарты не разрешают в качестве возвращаемого типа иметь тип, неявно преобразующийся к исходному? С целью запрета ковариации и контрвариации для переопределений методов и реализаций интерфейсов. Более подробно описано в книге C# in Depth(2-е издание), подраздел 2.2.2. "Нехватка ковариантных типов возвращаемого значения".

Комментариев нет:

Отправить комментарий