Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как избавиться от сообщений типа: [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]

Убирать не надо, а вот принять к действию стоит, ты создаешь базовый класс, в котором присутствуют абстрактные методы


Наверх

Титульная страница Поиск, карта сайта Написать письмо