Главная страница
    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.47 MB
Время: 0.004 c
4-1252106846
demon
2009-09-05 03:27
2011.12.11
Как обработать нажатие на кнопку минимизации?


4-1242382646
Игорь
2009-05-15 14:17
2011.12.11
Функция IsProcessInJob в Windows 2000


2-1314597578
petvv
2011-08-29 09:59
2011.12.11
Вызвать функцию exe из dll


2-1314656351
анонимус
2011-08-30 02:19
2011.12.11
TClientDataSet иерархия fielddefs


2-1314799215
Васюня
2011-08-31 18:00
2011.12.11
Пожлуйста, как нати все файлы в папке!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский