Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение принадлежности объекта к классу, Как бы по-быстрее? 
:(
    Опции темы
Limonadni Joe
Дата 3.9.2003, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Есть класс, у него есть много потомков, каждый потомок имеет по своему реализованную некую одноименную функцию. Нужно вызвать эту функцию не зная при этом к какому классу принадлежит объект. Можно ли это сделать быстрее, чем через перебор всех классов в if...else if...
PM MAIL ICQ YIM MSN   Вверх
Vit
Дата 3.9.2003, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Limonadni Joe
Дата 3.9.2003, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 1.11.2002
Где: Москва

Репутация: нет
Всего: 2



Цитата
Наследовать от одного предка и кастить при выполнении до этого предка
Если я правильно понимаю, "кастить" - это класс(объект).метод. Но тогда будет вызыватся функция предка (если она вообще есть), а не потомка. Так?
Цитата
деланием массива указателей на методы, хоть чтение метода из таблицы виртуальных методов
А можно по-подробнее, пожалуйста, - не мастак я в этом.
Цитата
неудачной архитектуре калассов
Безысходность какая-то hmmm.gif . Вроде всё заранее продумывал confused.gif .
PM MAIL ICQ YIM MSN   Вверх
altarasjuk
Дата 3.9.2003, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



ну тогда в предке телаешь:
protected
procedure Some; virtual; abstract;

и в потомках:
protected
procedure Some; override;
............

procedure TYourClass.Some;
begin
............
end;

и соответственно из предка вызываешь:
Some;


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Vit
Дата 4.9.2003, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Bose
Дата 26.10.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



аналогичный подвопрос. А если заранее неизвестно, будет ли этот метод переопределен в потомке, - можно ли как-то проверить его(метода) существование в предке, перед вызовом? т.е. если такой(virtual, abstract ) метод существует , то вызываем, если нет, то не вызываем. Потому, что если не проверять, то получается abstract error smile
PM MAIL WWW Skype   Вверх
Rennigth
Дата 26.10.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Bose
я вообще не сторонник abstract-ных методов, лутше уж пустой virtual.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Dimannn
Дата 26.10.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Я не пробовал, но может стоит посмотреть на адрес метода в оперативки (@Some)?


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
Bose
Дата 26.10.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Rennigth,
я тоже не сторонник. Просто я не знаю как обойтись без abstract. Хотя на нём свет клином не сошёлся, к тому же использование абстрактного метода тоже не решает проблемуsmile. В общем, мне совершенно все-равно каким образом будет этот метод обьявлен.
Если же я создам пустой virtual метод, то как можно проверить, был ли он переобьявлен в потомках?

Dimannn

я пробовал вот так:

Класс-родитель:
Код

  TcsForm = class(TForm)
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  ...
  published
      procedure RefreshData; virtual; abstract;
  end;

procedure TcsForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
     if Key=VK_F5 then
     begin
          if TcsForm(Sender).MethodAddress(RefreshData)<>nil then Caption:='ok' else Caption:='Sux';
     end;
end;

сейчас получается, что проверка TcsForm(Sender).MethodAddress(RefreshData)<>nil всегда даёт True smile

p.s. этот же вопрос я задал в теме Проверка существование метода

Это сообщение отредактировал(а) Bose - 26.10.2005, 14:28
PM MAIL WWW Skype   Вверх
Dimannn
Дата 27.10.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 14.4.2005
Где: Владимир

Репутация: нет
Всего: 1



Цитата(Bose @ 26.10.2005, 14:26)
TcsForm(Sender)


Это создаёт новый объект типа TcsForm. Попробуй так:

Код

if @((Sender as TcsForm).RefreshData) <> nil then


Отличие TcsForm(Sender) от Sender as TcsForm уже обсуждплось, пожешь поискать.


--------------------
Хотите быстро и без проблем опубликовать вашу программу в сети за 5 минут?
Тогда потратьте пару минут чтобы посмотреть, что предлагает OpenProject.org.ru
PM MAIL ICQ   Вверх
<Spawn>
Дата 27.10.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Цитата(Dimannn @ 27.10.2005, 17:27)
Это создаёт новый объект типа TcsForm. Попробуй так:

Зачем дезинформировать народ? Ни какой обьект не создатеся. Эта самое что ни наесть обычное явное приведение типов. as же лишь проверяет является ли экземпляр класса слева от оператора наследником или самим классом справа от оператора, если же это не так то генерируется исключение, какое правда не помню, в противном случае же происходит явное приведение типов.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Bose
Дата 27.10.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



не выдержав длительного ожидания ответа я завел новую тему здесь. Собственно, проблему мне помогли решить без проверки адреса метода. smile
Dimannn спасибо. Всегда приятно узнать что-то новое smile
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1242 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.