Abstract Error

7 отговора 106 прегледа
#1

Abstract Error

Някой може ли да каже каква е тази Abstrsct Error? Защо и от къде възниква?

Отговор
в отговор на turtle #2

Re: Abstract Error

Когато извикаш абстрактен метод се достига абстрактна грешка.

С други думи, ако в клас "А" имаш метод "М" който е деклариран като абстрактен, в клас "Б" (наследник на "А") този метод не е описан, създадеш инстанция на клас "Б" и извикаш метод "М" се стига до абстрактна грешка.

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на turtle #3

Re: Abstract Error

Да допълня " z_free (людоед) Публикувано 10.04.04 02:25" по въпроса "Защо":

Когато се създава клас, които ще бъде наследяван, често се налага всички наследници да притежават метод, работещ по различен начин в различните наследници. Ако този метод няма никаква обща част, добре е в родителския клас методът да е деклариран като абстрактен - така разработчикът получава предупреждения по време на компилиране, че се ползва клас с не пренаписан абстрактен метод.
Много е удобно при полиморфизъм.

Отговор
в отговор на NikB #4

Re: Abstract Error

Наследявам класа TCustomGrid, и не извиквам никакъв абстрактен метод.
При създаване на инстанция на този клас се получава тази грешка.При първото компилиране се появи следната грешка"Обекта не може да бъде собственик на самия себе си", след което започна да се появява Abstract Error.
Ето и кода на конструктора в който се създава инстанцията на класа наследник на TCustomGrid:

constructor TCal.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Width := 158;
Height:= 158;

FCalColors := TCalColors.Create(self);

FToolPanel := TPanel.Create(self);
with TPanel(FToolPanel) do begin
Parent := self;
Align := alTop;
ParentColor := True;
Caption := 'This is ToolPanel';
Ctl3D := False;
BevelOuter := bvNone;
BevelInner := bvNone;
BorderStyle := bsNone;
Height := 15;
Visible := True;
end;

FGrid := TCalGrid.Create(self);
with TCalGrid(FGrid) do begin[
Parent := self; Тук се получава грешката.
Align := alClient;
end;b
end;

Този конструктор се извиква в метода CreateForm() на формата която е и собственик на обекта "Cal"
Ето го и него:

procedure TForm1.FormCreate(Sender: TObject);
begin
if not Assigned(Cal) then
begin
Cal := TCal.Create(self);
with Cal do begin
Parent := Form1;
Left := 10;
Top := 10;
end;
end;
end;

А ето и обекта FCalGrid при който се получава грешката

TCalGrid = class(TCustomGrid)
private

protected

public
constructor Create(AOwner : TComponent);override;
published

end;


В конструkтора на обекта TCalGrid се извиква само наследения конструктор.
Това е програмката в самото начало и се получава тази грешка.
В класа TCalGrid няма други методи за сега:
Стана малко дълго но се постарах да стане по ясно.

Отговор
в отговор на turtle #5

Re: Abstract Error

Приятелю, за да не гадая какво са TCal, TCalColors, поопрости малко сорса, който си ми изпратил или изпрати целия проект на моя майл.
Нали въпрсът ти е само за TCalGrid?

А ако искаш да пробваш сам, в конструктора, който ти дава грешката, си сложи точка на прекъсване и малко по малко (с F8/F7) стигни до абстрактния метод.
(Добре ще е опцията Project/Options/Compiler/Use Debug DCU да е чекната).
Значи:
- като спреш на точката в конструктора, започваш да натискаш F8 и да изпълняваш ред по ред, докато стане грешката (запомняш на кой ред е).
- стартираш пак програмата слагаш точка на прекъсване на реда на грешката - като спреш на точката, натискаш F7, за да изпълниш постъпково съответната процедура на реда.
- като влезеш в процедурата, започваш с F8 ред по ред
- и т.н. и т.н - за 40 секунди си я намерил.

Отговор
в отговор на turtle #6

DrawCell e abstract

Сега виждам, че

procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); virtual; abstract;

Може да има и други - няма как да ти върви наследник на CustomGrid, без да пренапишеш абстрактните му методи.

Отиди в unit Grids, потърси декларацията
TCustomGrid = class(TCustomControl)
и виж всички абстрактни методи.

Отговор
в отговор на NikB #7

Re: DrawCell e abstract

Благодаря ти .
Човек така се учи(с питане);
А ако няма хора като теб няма от къде да се научи.
Още един път thank's.

Отговор
в отговор на turtle #8

Re: DrawCell e abstract

NikB e absoljutno prav.

Spored teoriqta abstrakten klas e tozi koito sydyrva PONE edin abstracted metod.
Ako tozi klas byde nasleden i ako v klasa naslednik abstraktniq (-nite) metodi ne se definirat (dori s prazni tela), to klasa naslednik sy6to se razglejda (e) abstracten.

Uspeh

Светът е малък нека си помагаме.
Отговор