Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.004 c
15-1314011606
MonoLife
2011-08-22 15:13
2011.12.11
Не работает aligment, D7


2-1314186301
Lamer6666
2011-08-24 15:45
2011.12.11
Проверка существования почтового ящика.


2-1314552284
Gu
2011-08-28 21:24
2011.12.11
Dll


2-1314023423
alexdn
2011-08-22 18:30
2011.12.11
Обьявление переменной в var


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский