Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2010, 17:22   #1
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию Вызвать функцию с известной сигнатурой для неизвестного класса. Интерфейс

Имеются 2 класса

Код:
A = class
  ...
  function abc: integer;
end;

B = class
  ...
  function abc: integer;
end;
TList заполняется экземплярами этих классов. Необходимо перебрать все экземпляры и выполнить для каждого функцию abc. Пробовал использовать interface

Код:
Iabc = interface
  function abc: integer;
end;

A = class (TInterfacedObject, Iabc )
  ...
  function abc: integer;
end;

B = class (TInterfacedObject, Iabc )
  ...
  function abc: integer;
end;
Как теперь воспользоваться тем что классы наследуют интерфейс?
Пробовал так:
перебираем элементы списка

Код:
Var
i: integer;
List: TList;
begin
{заполнили List}
for i:=0 to List.Count-1 do Iabc(List[i]).abc; 
end;
Ошибка read of adress
Ferrum26 вне форума Ответить с цитированием
Старый 21.07.2010, 20:05   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Ferrum26 Посмотреть сообщение
TList заполняется экземплярами этих классов.
Тогда такое приведение Iabc(List[i]) неверно.

Вот так:

Код:
var ABC:Iabc;

   for i:=0 to List.Count-1 do begin
      if TObject(List[i]).GetInterface(Iabc, ABC)
      then ABC.abc;
   end;
сработает ... один раз, но объекты, хранящиеся в списке будут уничтожены, т.к. после вызова интерфейс больше не используется.
alexBlack вне форума Ответить с цитированием
Старый 22.07.2010, 14:08   #3
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию

Объекты удалять нельзя, более того функции abc преобразуют эти объекты. Есть ли другой способ? Может есть вариант без использования интерфейсов?
Ferrum26 вне форума Ответить с цитированием
Старый 22.07.2010, 14:20   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Ferrum26 Посмотреть сообщение
Объекты удалять нельзя, более того функции abc преобразуют эти объекты. Есть ли другой способ? Может есть вариант без использования интерфейсов?
- Наследование от общего класса - предка.

- Если классов не слишком много - проверка условий. Что-то типа:

Код:
if        TObject(list[i]) is A then A(list[i]).abc
else if  TObject(list[i]) is B then B(list[i]).abc
//...
- вызов метода класса по имени
alexBlack вне форума Ответить с цитированием
Старый 22.07.2010, 14:26   #5
Ferrum26
Пользователь
 
Регистрация: 27.04.2010
Сообщений: 16
По умолчанию

Решил проблему следующим образом:

Код:
Tabc = class
  function abc: integer; virtual; abstract;
end;

A = class (Tabc)
  ...
  function abc: integer; Override;
end;

B = class (Tabc)
  ...
  function abc: integer; Override;
end;
Код:
Var
i: integer;
List: TList;
begin
{заполнили List}
for i:=0 to List.Count-1 do Tabc(List[i]).abc; 
end;
Ferrum26 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать функцию из функции ? PheonixS JavaScript, Ajax 3 16.12.2010 05:35
Как вызвать метод из другого класса в C# KobolD Помощь студентам 6 25.06.2010 14:12
Не могу вызвать функцию (( NewKoder Общие вопросы C/C++ 4 11.12.2009 17:26
Вызвать функцию ассемблера из С++ Dima88 Помощь студентам 3 11.12.2009 00:54
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22