![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Надо в форме-родителе вызвать метод который будет реализован в некоторых формах-наследниках(не во всех). Т.е. сначала надо проверить, существует ли этот метод в наследнике и, если существует, то вызвать его. Класс-родитель:
сейчас получается, что проверка TcsForm(Sender).MethodAddress(RefreshData)<>nil всегда даёт True ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 4 Всего: 110 |
уже не помню, как с этим в Delphi, но вообще, abstract приводит к тому, что если его не переопределить, то даже объект создать такой нельзя - компилятор не позволит...
-------------------- qqq |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
хммм.... у меня создается... почему-то
![]() но не суть... мне все-равно, будет там abstract или нет... около 40 форм уже сделано. и где-то примерно в 20 реализован метод RefreshData. И нужно сделать так, чтобы этот метод вызывался по нажатию на F5. Я заменил предка для всех форм с TForm на свою TcsForm (Search & Replace). И в TcsForm пытаюсь проверить, реализован ли этот метод в той форме из которой пришло событие OneKeyDown... |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 4 Всего: 110 |
ну тогда можно сделать так:
1. делаем в предке переменную (на всякий случай в private, чтобы никто из потомков не изменил) 2. реализовываем в предке эту функцию и пишем туда flag:=false, больше она ничего не делает перед вызовом делаем flag:=true вызываем функцию проверяем flag -------------------- qqq |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
но тогда я не смогу вызвать одноименный метод, реализованный в потомке
![]() т.е. каждый раз, когда я буду вызывать этот метод в предке, у меня будет вызываться метод, который только и умеет, что изменять флаг ![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 4 Всего: 110 |
нет, в этом и весь смысл виртуальности если в предке реализован какой-то виртуальный метод, а в потомке переопределен, то даже из предка будет вызываться метод потомка... -------------------- qqq |
|||
|
||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
получилось!
Спасибо, maxim1000! Я до сих пор не могу осмыслить всей гибкости предостовляемой ОбьектноОриентированным Программированием, и черезвычайно радуюсь, когда удается узнать новый прием. ![]() В общем я сделал так: в предке создал пустой виртуальный метод RefreshData
а ко всем обьявлениям RefreshData в потомках, добавил директиву override; (заработало все только после добавления override) только я все-равно не понимаю, почему оно не работало, без override. как я себе представлял, override же должен был прятать метод TcsForm.RefreshData, что мне совсем не должно было мешать... А на деле оказалось совсем наоборот... ![]() |
|||
|
||||
<Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Это можно запросто реализовать через интерфейсы:
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
<Spawn> |
|
||||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
override ни чего не прячет! Он указывает компилятору создать нужные связи в VMT(Virtual Method Table, если не ошибаюсь) таблице для того, чтобы методы экземпляра класса наследника можно было вызвать из переменной класса предка. Т.е.:
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
||||
|
|||||
Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
<Spawn>
Я имел в виду, что вот здесь:
с моей точки зрения должен был бы сработать TMyClass3.Hi; а не TMyClass.Hi, а применение директивы override при обьявлении TMyClass3.Hi, позволило бы вызвать TMyClass.Hi из TMyClass3.Hi. Короче, я ошибался. =) p.s. Вот такие вот подробные обьяснения, было бы неплохо включать в FAQ Vingrad'a... ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |