Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Как избавиться от сообщений типа:   Найти похожие ветки 

 
Prok12   (2002-09-08 16:46) [0]

[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 вводить свои абстрактные методы.


 
Anatoly Podgoretsky ©   (2002-09-08 16:49) [1]

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


 
Криворукий   (2002-09-08 16:52) [2]

>MyChild: TGraphicBase, (полиморфизм), и создаю оператором
>MyChild := TGraphicBase.Create(Self)

Это не полиморфизм.

Полиморфизм предполагает
MyChild: TGraphicBase, (полиморфизм), и создаю оператором
MyChild := TGraphicClildClass.Create(Self)

Причём в TGraphicClildClass (= class(TGraphicBase)) абстрактные методы перекрыты.

А создавать экземпляр базового класса в общем случае бессмысленно.


 
Prok12   (2002-09-09 10:27) [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-09 10:34) [4]

Избавление от Warning

type
TMyBaseClassClass = class of TMyBaseClass;

var
MyBaseClass : TMyBaseClassClass;
begin
MyBaseClass := TMyChild;
MyChild := MyBaseClass.CreateNew(nil, 0);
...




 
Юрий Федоров ©   (2002-09-09 10:39) [5]

{$WARNINGS OFF}
хотя в данном случае нужно именно бороться с причиной



Страницы: 1 вся ветка

Текущий архив: 2002.09.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
8-61223
MasterA
2002-05-21 17:19
2002.09.19
Физика и графика


1-61169
dim-
2002-09-07 16:20
2002.09.19
Получить все значения ключа реестра


14-61254
RealDummy
2002-08-22 02:44
2002.09.19
Создание сайта


1-61135
d_oleg
2002-09-06 09:50
2002.09.19
TBitMap - изменение размера


3-60944
Adoon
2002-08-27 16:31
2002.09.19
Первый символ поля типа varchar