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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
26 апр. 2024, в 06:46
1500 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект