![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избавиться от сообщений типа: [D5, Win2k]
Prok12 © (2002-09-08 16:46:00)[Warning]: Constructing instance of "TGraphicBase" containing abstract methods?
Суть проблемы такова.
Имею базовый (родительский) класс:
type TGraphicBase = class(TImage)
......................
protected { Protected declarations }
procedure AboutBox; virtual; abstract;
......................
end;
Строю на основе этого класса несколько дочерних классов, в которых и описываю реализацию procedure AboutBox: в них эта процедура описывется, как override.
В модуле, где используются эти дочерние классы, описываю некоторые из них так:
MyChild: TGraphicBase, (полиморфизм), и создаю оператором
MyChild := TGraphicBase.Create(Self)
При этом получаю при компиляции указанное сообщение (относящееся к строке Create), хотя в целом вся программа работает нормально...
Аналогичную проблему имею, когда мой базовый класс происходит от TForm, а создаю я его с помощью переопределения (override) метода TForm.CreateNew. Снова не удаётся без этих Warning вводить свои абстрактные методы.
Юрий Федоров (2002-09-09 10:39:00) [1]{$WARNINGS OFF}
хотя в данном случае нужно именно бороться с причиной
Ученик (2002-09-09 10:34:00) [2]Избавление от Warning
type
TMyBaseClassClass = class of TMyBaseClass;
var
MyBaseClass : TMyBaseClassClass;
begin
MyBaseClass := TMyChild;
MyChild := MyBaseClass.CreateNew(nil, 0);
...
Prok12 (2002-09-09 10:27:00) [3]С замечанием насчёт полиморфизма согласен. Попробую сформулировать по-другому.
Аналогичную проблему имею, когда мой базовый класс происходит от TForm, а создаю я его с помощью переопределения (override) метода TForm.CreateNew. Здесь я уже не использовал полиморфизм, т.е. описывал и создавал дочерние классы так:
type TMyBaseClass = class(TForm) // Базовый (родительский) класс
.............
procedure DrawPicture(AddBottomText: String); virtual; abstract;
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;
{---------------------------------------------------------------}
type TMyChild = class(TMyBaseClass) // Дочерний класс
.............
procedure DrawPicture(AddBottomText: String); override;
end;
{---------------------------------------------------------------}
type MyChild: TMyChild
..................................
MyChild := TMyChild.CreateNew(nil, 0) // Создаём дочерний класс - и сразу тот-же Warning!
т.е, снова не удалось без этих Warning добавить свои абстрактные методы (хотя опять же - программа работает!).
Криворукий (2002-09-08 16:52:00) [4]>MyChild: TGraphicBase, (полиморфизм), и создаю оператором
>MyChild := TGraphicBase.Create(Self)
Это не полиморфизм.
Полиморфизм предполагает
MyChild: TGraphicBase, (полиморфизм), и создаю оператором
MyChild := TGraphicClildClass.Create(Self)
Причём в TGraphicClildClass (= class(TGraphicBase)) абстрактные методы перекрыты.
А создавать экземпляр базового класса в общем случае бессмысленно.
Anatoly Podgoretsky (2002-09-08 16:49:00) [5]Убирать не надо, а вот принять к действию стоит, ты создаешь базовый класс, в котором присутствуют абстрактные методы