![]() |
Eine klasse versiegeln (kein .net)
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:
Man kann klassen natürlich auch zu anderen zwecken versiegeln, zB. um bestimmt funktionalitäten zu schützen etc.
procedure TForm1.Button1Click(Sender: TObject);
begin TMySealedClass.Create; // funktioiert TMyImpossibleClass.Create; // funktioniert nicht end; Viel spass beim versiegeln :-D |
Re: Eine klasse versiegeln (kein .net)
Nett, aber was, wenn ich ich in der Ableitung die Methode ebenfalls wieder überschreibe?
Delphi-Quellcode:
TMyImpossibleClass = class(TMySealedClass)
private // irgendwas neues public class function NewInstance: TObject; override; end; implementation { TMyImpossibleClass } class function TMyImpossibleClass.NewInstance: TObject; begin result := TObject.NewInstance; end; |
Re: Eine klasse versiegeln (kein .net)
Na, dann weisst du offensichtlich was du tust und bist selbst schuld :mrgreen: ...hab ja nicht gesagt das es unmöglich ist (oder doch). Es soll ja nur verhindert werden, das andere, uninformierte personen gedankenverloren ableitungen instanzieren.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz