Hallo,
beim arbeiten mit klassen kann es manchmal notwendig sein, dass diese nicht abgeleitet werden dürfen oder sollen. Dh. man
versiegelt diese klasse (.net lässt grüssen), was ich hier mittels einer
Exception demonstrieren möchte!
Wichtig kann sowas sein, wenn man vor hat das aloziieren des speichers selbst zu übernehmen und dies nicht delphi überlassen will. Zb. kann man mit einem 'node manager' objekte, gleicher grösse, auf ein array mappen, wobei die grösse der objekte dann natürlich nicht variieren darf. Also muss man dafür sorgen, dass niemand die klasse erweitert - und hier kommt jetzt das versiegeln ins speil:
Delphi-Quellcode:
type
ESealedClassViolation = Class(TObject);
// diese klasse soll versiegelt werden,
// dh. sie soll efektiv nicht ableitbar sein!
TMySealedClass = class(TObject)
private
// was auch immer
public
// was auch immer
class function NewInstance: TObject; override;
end;
// diese ableitung kann man zwar schreiben,
// aber das instanzieren wird fehlschlagen
TMyImpossibleClass = class(TMySealedClass)
private
// irgendwas neues
public
end;
implementation
{ TMySealedClass }
// der perfekte punkt um das instanzieren von objekten abzuwürgen
class function TMySealedClass.NewInstance: TObject;
begin
if self <> TMySealedClass then raise ESealedClassViolation.Create;
result := inherited NewInstance;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
TMySealedClass.Create; // funktioiert
TMyImpossibleClass.Create; // funktioniert nicht
end;
Man kann klassen natürlich auch zu anderen zwecken versiegeln, zB. um bestimmt funktionalitäten zu schützen etc.
Viel spass beim versiegeln
mâxîmôv.
{KDT}