Abstract Error
7 отговора
106 прегледа
Re: Abstract Error
Когато извикаш абстрактен метод се достига абстрактна грешка.
С други думи, ако в клас "А" имаш метод "М" който е деклариран като абстрактен, в клас "Б" (наследник на "А") този метод не е описан, създадеш инстанция на клас "Б" и извикаш метод "М" се стига до абстрактна грешка.
-------------
Special killer double trouble triple extra nicotine monster!
С други думи, ако в клас "А" имаш метод "М" който е деклариран като абстрактен, в клас "Б" (наследник на "А") този метод не е описан, създадеш инстанция на клас "Б" и извикаш метод "М" се стига до абстрактна грешка.
-------------
Special killer double trouble triple extra nicotine monster!
Re: Abstract Error
Да допълня " z_free (людоед) Публикувано 10.04.04 02:25" по въпроса "Защо":
Когато се създава клас, които ще бъде наследяван, често се налага всички наследници да притежават метод, работещ по различен начин в различните наследници. Ако този метод няма никаква обща част, добре е в родителския клас методът да е деклариран като абстрактен - така разработчикът получава предупреждения по време на компилиране, че се ползва клас с не пренаписан абстрактен метод.
Много е удобно при полиморфизъм.
Когато се създава клас, които ще бъде наследяван, често се налага всички наследници да притежават метод, работещ по различен начин в различните наследници. Ако този метод няма никаква обща част, добре е в родителския клас методът да е деклариран като абстрактен - така разработчикът получава предупреждения по време на компилиране, че се ползва клас с не пренаписан абстрактен метод.
Много е удобно при полиморфизъм.
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 няма други методи за сега:
Стана малко дълго но се постарах да стане по ясно.
При създаване на инстанция на този клас се получава тази грешка.При първото компилиране се появи следната грешка"Обекта не може да бъде собственик на самия себе си", след което започна да се появява 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 няма други методи за сега:
Стана малко дълго но се постарах да стане по ясно.
Re: Abstract Error
Приятелю, за да не гадая какво са TCal, TCalColors, поопрости малко сорса, който си ми изпратил или изпрати целия проект на моя майл.
Нали въпрсът ти е само за TCalGrid?
А ако искаш да пробваш сам, в конструктора, който ти дава грешката, си сложи точка на прекъсване и малко по малко (с F8/F7) стигни до абстрактния метод.
(Добре ще е опцията Project/Options/Compiler/Use Debug DCU да е чекната).
Значи:
- като спреш на точката в конструктора, започваш да натискаш F8 и да изпълняваш ред по ред, докато стане грешката (запомняш на кой ред е).
- стартираш пак програмата слагаш точка на прекъсване на реда на грешката - като спреш на точката, натискаш F7, за да изпълниш постъпково съответната процедура на реда.
- като влезеш в процедурата, започваш с F8 ред по ред
- и т.н. и т.н - за 40 секунди си я намерил.
Нали въпрсът ти е само за TCalGrid?
А ако искаш да пробваш сам, в конструктора, който ти дава грешката, си сложи точка на прекъсване и малко по малко (с F8/F7) стигни до абстрактния метод.
(Добре ще е опцията Project/Options/Compiler/Use Debug DCU да е чекната).
Значи:
- като спреш на точката в конструктора, започваш да натискаш F8 и да изпълняваш ред по ред, докато стане грешката (запомняш на кой ред е).
- стартираш пак програмата слагаш точка на прекъсване на реда на грешката - като спреш на точката, натискаш F7, за да изпълниш постъпково съответната процедура на реда.
- като влезеш в процедурата, започваш с F8 ред по ред
- и т.н. и т.н - за 40 секунди си я намерил.
DrawCell e abstract
Сега виждам, че
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); virtual; abstract;
Може да има и други - няма как да ти върви наследник на CustomGrid, без да пренапишеш абстрактните му методи.
Отиди в unit Grids, потърси декларацията
TCustomGrid = class(TCustomControl)
и виж всички абстрактни методи.
procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); virtual; abstract;
Може да има и други - няма как да ти върви наследник на CustomGrid, без да пренапишеш абстрактните му методи.
Отиди в unit Grids, потърси декларацията
TCustomGrid = class(TCustomControl)
и виж всички абстрактни методи.
Re: DrawCell e abstract
Благодаря ти .
Човек така се учи(с питане);
А ако няма хора като теб няма от къде да се научи.
Още един път thank's.
Човек така се учи(с питане);
А ако няма хора като теб няма от къде да се научи.
Още един път thank's.
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
Светът е малък нека си помагаме.
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
Светът е малък нека си помагаме.