Задать вопрос
WebDev2030
@WebDev2030
Битриксоид до мозга и костей

Почему я не могу объявить аргумент метода типа потомка от аргумента родительского класса?

1. Я создал абстрактный класс Repository, в нем создал метод store, который принимает параметр типа BaseDTO.
2. Далее я создаю потомка класса BaseDTO и называю MyDTO.
3. Далее создаю потомка Repository с названием MyRepository объявляю метод store, но в качестве аргумента указываю не сам BaseDTO, а его потомка MyDTO.
Почему я получаю ошибку, что Declaration of MyRepository must be compatible with BaseDTO при том, что в качестве аргумент объявлен потомок BaseDTO? Т.е. получается в качестве аргумента нельзя указывать потомка от аргумента родительского класса?
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Ковариантность и контравариантность ¶
Официальная документация

Если коротко: сужать тип у метода наследника можно для возвращаемого значения, а для аргумента можно расширять. И только так, дабы соблюсти Liskov Substitution Principle. В TypeScript это самая популярная проблема, куда разрабов языка постоянно тыкают носом... тк программы в рантайме падают из-за возможности расширять/сужать как тип параметра, так и возвращаемого значения
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы