Форум: "Основная";
Текущий архив: 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