![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Есть класс, у него есть много потомков, каждый потомок имеет по своему реализованную некую одноименную функцию. Нужно вызвать эту функцию не зная при этом к какому классу принадлежит объект. Можно ли это сделать быстрее, чем через перебор всех классов в if...else if...
|
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Наследовать от одного предка и кастить при выполнении до этого предка - это так решается по нормальному в OOП. Если надо по не нормальному реализовывать, то можно хоть if, хоть деланием массива указателей на методы, хоть чтение метода из таблицы виртуальных методов. В общем вариантов масса, но полученная вами проблема говорит о неудачной архитектуре калассов
-------------------- 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 |
|||
|
||||
| Limonadni Joe |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
|
||||||
|
|||||||
| altarasjuk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 7.5.2003 Где: Харьков Репутация: 1 Всего: 1 |
ну тогда в предке телаешь:
protected procedure Some; virtual; abstract; и в потомках: protected procedure Some; override; ............ procedure TYourClass.Some; begin ............ end; и соответственно из предка вызываешь: Some; -------------------- Правда - изобретение маньяков: колет глаза и режет уши. |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Чтение таблицы виртуальных методов описывать не буду из зловредности - есть прекрасное и правильное решение - тебе его altarasjuk написал - все карты в руки...
-------------------- 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 |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
аналогичный подвопрос. А если заранее неизвестно, будет ли этот метод переопределен в потомке, - можно ли как-то проверить его(метода) существование в предке, перед вызовом? т.е. если такой(virtual, abstract ) метод существует , то вызываем, если нет, то не вызываем. Потому, что если не проверять, то получается abstract error
|
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Bose
я вообще не сторонник abstract-ных методов, лутше уж пустой virtual. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Dimannn |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 14.4.2005 Где: Владимир Репутация: нет Всего: 1 |
Я не пробовал, но может стоит посмотреть на адрес метода в оперативки (@Some)?
-------------------- Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут? Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Rennigth,
я тоже не сторонник. Просто я не знаю как обойтись без abstract. Хотя на нём свет клином не сошёлся, к тому же использование абстрактного метода тоже не решает проблему Если же я создам пустой virtual метод, то как можно проверить, был ли он переобьявлен в потомках? Dimannn я пробовал вот так: Класс-родитель:
сейчас получается, что проверка TcsForm(Sender).MethodAddress(RefreshData)<>nil всегда даёт True p.s. этот же вопрос я задал в теме Проверка существование метода Это сообщение отредактировал(а) Bose - 26.10.2005, 14:28 |
|||
|
||||
| Dimannn |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 14.4.2005 Где: Владимир Репутация: нет Всего: 1 |
Это создаёт новый объект типа TcsForm. Попробуй так:
Отличие TcsForm(Sender) от Sender as TcsForm уже обсуждплось, пожешь поискать. -------------------- Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут? Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru |
||||
|
|||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Зачем дезинформировать народ? Ни какой обьект не создатеся. Эта самое что ни наесть обычное явное приведение типов. as же лишь проверяет является ли экземпляр класса слева от оператора наследником или самим классом справа от оператора, если же это не так то генерируется исключение, какое правда не помню, в противном случае же происходит явное приведение типов. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
не выдержав длительного ожидания ответа я завел новую тему здесь. Собственно, проблему мне помогли решить без проверки адреса метода.
Dimannn спасибо. Всегда приятно узнать что-то новое |
|||
|
||||
![]()
|
| Правила форума "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. |