|
0 / 0 / 0
Регистрация: 06.10.2018
Сообщений: 1
|
||||||
Вызывается метод родителя, а не наследника. (Проблема с наследованием в параметрах метода)06.12.2021, 19:21. Показов 2665. Ответов 7
Метки нет (Все метки)
Помогите, пожалуйста, у меня есть класс Entity, в котором работает коллайдер.
При вызове метода Visit в методе Collide, где ent1 - Player, а ent2 - Enemy, должен быть вызван метод дочернего класса Enemy :: Visit (Player player), но вызывается метод Entity :: Visit (Entity entity). При этом при выводе ent1.GetType () пишет, что это Player, а ent2.GetType () - Enemy. Подскажите пожалуйста как реализовать мою идею? Если я вручную кастую ent1 в Player, все будет работать, но мне нужна универсальность, так как в моей игре больше объектов.
0
|
||||||
| 06.12.2021, 19:21 | |
|
Ответы с готовыми решениями:
7
Проблема с наследованием одного класс от другого и методом __init__ у наследника
Google_mock тест на вызов метода проваливается, если метод вызывается дважды |
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 06.12.2021, 21:09 | |
|
Компилятор c# такого не умеет. Если тип параметра Entity то и самый подходящий метод - Visit(Entity entity);
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||||||
| 06.12.2021, 21:39 | ||||||
|
А если поменять вызов на
По идее тогда будет вызываться перегрузка Visit с типом класса, в котором вызов происходит...
0
|
||||||
|
Модератор
|
||||||||||||
| 07.12.2021, 01:28 | ||||||||||||
Ведь у ent1 тип IEntityVisitor. А такой перегрузки я в коде не вижу. Объяснения по моему варианту. Выбор перегрузки метода осуществляется компилятором по типу переменой объявленной в коде. Какой реально в рунтайм будет тип объекта в этой переменной компилятор не может знать. Поэтому для вызова нужной перегрузки надо сначала проверить тип объекта в переменной, если он нужного типа, то привести его к этому типу и потом вызвать соответствующую перегрузку. В вашем же коде проблема не в том, что компилятор "не видит" переопределения метода в производном классе. Дело в том, что вы переопредели перегрузку Visit(Player), а тип переменной у вас IEntityVisitor, поэтому компилятор вызывает перегрузку Visit(IEntityVisitor), которую вы не переопределяли.Добавлено через 9 минут TopOwl, запутался в вашем коде! Перепутал переменные. Мой код верный, но не совсем верны объяснения.
ent2 метод Visit(Entity) из интерфейса IEntityVisitor.Наверное, класс Entity реализует этот интерфейс.В Enemy вы не переопределяете перегрузку Visit(Entity), поэтому вызывается базовая (и единственная) его реализация.А чтобы вызвать перегрузку Visit(Player) нужно, как в моём коде, привести объект к нужному типу, чтобы компилятор "понял" какая перегрузка сам нужна.
0
|
||||||||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||||||
| 07.12.2021, 09:15 | ||||||
1
|
||||||
|
Модератор
|
||||
| 07.12.2021, 16:54 | ||||
this типизирован как Entity, поэтому будет вызываться перегрузка Visit(Entity), а TC нужно вызвать перегрузку Visit(Player).Без приведения ent1 (или this) к типу Player вызывать эту перегрузку не получится.Но ТС и так пытается его реализовать. Просто у него не получается это сделать. А откуда у вас взялось переопределение перегрузки Visit(Player), если в базовом Entity нет такой виртуальной перегрузки?TopOwl, дайте полные сигнатуры типов IEntityVisitor, Entity, Enemy, Player и всех перегрузок методов Visit и Collide в них.
0
|
||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|
| 07.12.2021, 17:08 | |
|
0
|
|
| 07.12.2021, 17:08 | |
|
Помогаю со студенческими работами здесь
8
Почему если при вызове метода Foo от типа B, в объекте класса FooImp вызывается метод от А?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|