Страницы

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

суббота, 1 февраля 2020 г.

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

#c_sharp


Допустим есть класс А, реализующий  интерфейс 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: вопрос сугубо о причине описанного запрета. Пожалуйста, не предлагайте способы
его обойти, их я и сам могу придумать с десяток.    


Ответы

Ответ 1



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

Ответ 2



А как насчёт public I foo() { return new A(); } ?

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

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