Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.11;
Скачать: CL | DM;

Вниз

Перекрытие абстрактного метода в наследнике   Найти похожие ветки 

 
Timer Writer   (2010-06-17 17:16) [0]

Есть run-time пакет P1, а в нем форма с абстрактным методом:

type
 TMyCustomForm = class(TForm)
   ...
 private
   procedure Proc;
 protected
   procedure DoProc; virtual; abstract;
 public
   constructor Create(AParam: integer); reintroduce; virtual;
 end;

 TMyCustomFormClass = class of TMyCustomForm;

procedure TMyCustomForm.Proc;
begin
 ... // что-то делаем
 DoProc
end;

Пакет P1 входит в requires другого run-time пакета P2. В пакете P2 есть наследник формы TMyCustomForm с реализованным методом DoProc:

type
 TMyForm = class(TMyCustomForm)
   ...
 protected
   procedure DoProc; override;
 end;

procedure TMyForm.DoProc;
begin
 ... // что-то делаем
end;

initialization
 RegisterClasses([TMyForm]);

Приложение собрано с run-time пакетом P1, а пакет P2 грузит динамически. После его загрузки форма TMyForm создается так:

var
 AClass: TMyCustomFormClass;
begin
 AClass = TMyCustomFormClass(FindClass(...));
 AClass.Create(0)
end;

Дебаггер показывает, что AClass именно тот, который нужен - то есть TMyForm. Конструктор виртуальный. Вроде бы, все правильно - но при вызове метода DoProc получаем Abstract Error.

Проверил все, но не могу понять, в чем дело. Кто-нибудь подскажет?


 
Сергей М. ©   (2010-06-17 17:28) [1]

У класса, ссылка на который получена и хранится в AClass, метод DoProc как раз и есть абстрактный, чему же тут удивляться ?


 
Timer Writer   (2010-06-17 17:38) [2]

Вынужден повториться: "Дебаггер показывает, что AClass именно тот, который нужен - то есть TMyForm".

А метод TMyForm.DoProc - НЕ абстрактный. Он перекрыт.


 
Сергей М. ©   (2010-06-17 17:43) [3]


> Дебаггер показывает, что AClass именно тот, который нужен
> - то есть TMyForm


Не знаю что и где он у тебя показывает, но ты создал объект конкретно класса TMyCustomForm (а не TMyForm), метод DoProc которого абстрактный.


 
_Юрий ©   (2010-06-17 19:19) [4]


>  но ты создал объект конкретно класса TMyCustomForm


почему ? Зарегистрирован то класс TMyForm


 
KilkennyCat ©   (2010-06-17 19:59) [5]


> _Юрий ©   (17.06.10 19:19) [4]



> var
>  AClass: TMyCustomFormClass;


 
~AQUARIUS~ ©   (2010-06-17 21:43) [6]

KilkennyCat ©

Это не должно ничего менять. С TStrings"ами работаете вроде без проблем, не так ли? А в большинстве компонентов оно обьявлено как TStrings, а содается как TStringList/TMemoStrings/и т.д.


 
KilkennyCat ©   (2010-06-17 22:12) [7]


> а содается как TStringList/TMemoStrings/и т.д

некорректное сравнение, но ладно, соглашусь.
но как оно создается там, и как здесь?


 
Сергей М. ©   (2010-06-17 22:53) [8]


> ~AQUARIUS~ ©   (17.06.10 21:43) [6]


> а содается как TStringList/TMemoStrings/и т.д.


Вот именно.
А автор создает TStrings и желает при этом пользовать перекрытый метод хз какого наследника. Да еще и удивляется почему грабли)


 
Timer Writer   (2010-06-18 01:28) [9]

Коллеги, я советовал бы вам поближе ознакомиться с метаклассами (class of) и виртуальными конструкторами - что это такое, зачем они нужны, когда и как используются. После этого вы поймете, что приведенный выше код абсолютно верен (хотя обладателям значка "Мастер Delphi" следовало бы понять это сразу).

А грабли я нашел. Они были в другом месте.



Страницы: 1 вся ветка

Текущий архив: 2011.12.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
15-1314028401
Медвежонок Пятачок
2011-08-22 19:53
2011.12.11
Райт-ту-Лефт письменность


2-1314277947
Scott Storch
2011-08-25 17:12
2011.12.11
Почему warning?


2-1314743749
Lamer6666
2011-08-31 02:35
2011.12.11
IdHttp.Post и точка


2-1314597307
brother_home
2011-08-29 09:55
2011.12.11
как правильно обратиться к полю?


15-1309379404
Юрий
2011-06-30 00:30
2011.12.11
С днем рождения ! 30 июня 2011 четверг