![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
1) Есть Class1, с методом Mtd.
2) Eсть Class2 наследованный от Class1, метод Mtd перезаписан 3) В программе используется переменная типа Class2 Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка? -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
У меня всегда получалось это прямым преобразованием:
var a:class2; begin a:=class2.Create; class1(a).mtd; .... end; -------------------- Волны гасят ветер... |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Не хочет, вызывает метод текущего класса... Или я криво тестировал?
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Вот мой тестовый код:
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Le Taon |
|
|||
|
Unregistered |
Способ со статическим приведением годится только для
невиртуальных методов, имеющих одно имя. Вызов же виртуальных методов от статического типа не зависит. В твоём простейшем случае достаточно написать inherited Mtd; (ты его можешь вызвать из любого метода TClass2, не только из Mtd). Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д. Один из способов, описанных в литературе, - временная замена VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом. Я предпочитаю такой способ: type TProc = procedure of object; procedure TClassN.SomeMethod; var Proc: TProc; begin TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес TMethod(Proc).Data := Self; Proc(); end; |
|||
|
||||
| Le Taon |
|
|||
|
Unregistered |
Прошу прощения, ты вызываешь Mtd предка не из метода потомка, поэтому inherited не пройдёт.
Но способ со взятием статического адреса метода сработает. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Спасибо!
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Блин, а что же ты не написал, что он у тебя виртуальный? Я подумал что перезаписан это в смысле статически перекрыт. С виртуальным методом действительно статическое преобразование к такому результату не приведет, так как адрес метода все равно будет взят из vtable.
Взятие статического адреса, конечно, выход, но мне почему-то все время думается, нафиг мы тогда вообще полиморфизм придумали? По идее ООП разработка должна быть такая, чтобы классы было удобно исрользовать, а не прибегать к таким трюкам. -------------------- Волны гасят ветер... |
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
По недоумию...
Она и есть на 99.9% такая, но любые ограничения накладываемые любой технологией могут мешать разрботке каких-то специфичных вещей... Возникновение языков высокого уровня избавило от необходимости писать тысячи строк кода для элементарных действий, но ассемблер до сих пор находит применение в отдельных случаях, без него никак. Возникновение визуального программирования избавило от трудоёмкого и нудного "расставляния" компонентов в коде, но во многих случаях все иногда создают компоненты в run-time. То же самое и с объектными технологиями, да - они решили много проблем и сделали написание кода намного удобнее, но тем не менее есть и будут случаи, когда они должны быть использованы действия, идущие в разрез с идеологией. Так было и так всегда будет для всех технологий... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |