Einzelnen Beitrag anzeigen

Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#1

Eine klasse versiegeln (kein .net)

  Alt 19. Aug 2004, 13:15
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}
  Mit Zitat antworten Zitat