constructors og destructors

Tags:    delphi

Jeg er begyndt at bruge classes, og i den forbindelse kunne jeg godt tænke mig at vide noget om constructors og destructors.

Taget fra delphi hjælp:

constructor TShape.Create(Owner: TComponent);
begin
inherited Create(Owner); // Initialize inherited parts
Width := 65; // Change inherited properties
Height := 65;
FPen := TPen.Create; // Initialize new fields
FPen.OnChange := PenChanged;
FBrush := TBrush.Create;
FBrush.OnChange := BrushChanged;
end;

Spørgsmål: Hvad gør den første linje, og er den nødvendig:
inherited Create(Owner);

destructor TShape.Destroy;
begin
FBrush.Free;
FPen.Free;
inherited Destroy;
end;


Det samme spørgsmål om inherited her som ovenfor.

[Warning] Area.pas(43): Method 'Destroy' hides visual method of base type 'TObject'

hvad betyder denne Warning? Er det noget man skal gøre noget ved? Har det nogen betydning for om der destroyes ordentligt? Skal man hellere bruge destroyers som Free eller Release eller skal man finde på et andet navn?

Hun uddybende svar giver fuld point.



9 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Inherit er et Engelsk ord og betyder at arve!

Inherited Create(Owner);

Så det denne kode gør er at den arver alle Create properties fra den klasse forælder (Parent) klassen! I dit tilfælde er det vist klassen TComponent. Det er meget vigtigt at hvis en klasse arver fra en anden klasse det bliver gjort korrekt, ellers vil der opstå fejlmeddelser!

[Warning] Area.pas(43): Method 'Destroy' hides visual method of base type 'TObject'

Denne advarsel vil opstå, hvis du eksempelvis har ladet din Destructor procedure være under private eller protected! Da der derfor ikke vil kunne benyttes "ude fra" klassen. Altså fra kode der er implementeret i en anden unit!

Håber det hjalp!

[Redigeret d. 15/03-04 17:10:31 af Søren Klit Lambæk]



Hvis du har en selvstændig klasse der ikke arver fra mogen andre klasser, havde du ikke behøvet Inherited()...

type
TMinKlasse = class
protected
private
public
constructor Create;
destructor Destroy; override; //Overrider min destroy, og ignorere derfor alle førdefinerede destroy!
end;

implementation

constructor TMinKlasse.Create;
begin

end;

destructor TMinKlasse.Destroy;
begin

end;


[Redigeret d. 15/03-04 17:22:07 af Søren Klit Lambæk]



okay.

Fold kodeboks ind/udKode 


det vil sige at inherited creater / destroyer TObject i dette tilfælde?

hvad skal jeg ændre for ikke at få advarslen?



Kort fortalt:

"Inherited" kalder den metoden fra den klasse der er nedarvet fra.

MvH

Stefan Svensson
http://fusket.frac.dk



Jeg var vist lidt for hurtig!

Destroy skal overrides for at advarslen forsvinder!!!!!!!!!!



Fold kodeboks ind/udKode 




så jeg skal altså ikke bruge inherited når den bare er arvet fra en TObject?




Sådan ser nedarvningen ud:

TObject

TComponent

TControl

TForm - TButton - TCheckBox osv.

Taget fra Delphi's hjælpe fil:

"Simplified VCL hierarchy

The diagram above, a greatly simplified view of the inheritance hierarchy of the Visual Component Library, illustrates how everything in the VCL is an object, though many objects, such as TForm, are often referred to as components.Components, which inherit data and code from a TObject type, are objects with additional properties, methods, and events that make them suitable for specialized purposes, such as the ability to save their state to a file. Controls, which inherit data and code from a TComponent type (which in turn inherits elements from TObject) have additional specialized capabilities, such as the ability to display something. So controls are components and objects, components are objects but not necessarily controls, and objects are simply objects. This chapter refers to all components and controls as objects.

Even though TCheckBox isn’t an immediate descendant of TObject, it still has all the attributes of any object because TCheckBox is ultimately derived from TObject in the VCL hierarchy. TCheckBox is a very specialized kind of object that inherits all the functionality of TObject, TComponent, and TControl, and defines some unique capabilities of its own."



TObject arver ikke fra andre klasser... så Nej, den skal derfor ikke nedarves! :D

[Redigeret d. 15/03-04 17:41:48 af Søren Klit Lambæk]

[Redigeret d. 15/03-04 17:43:47 af Søren Klit Lambæk]



t