Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Object-Pascal / Delphi-Language (https://www.delphipraxis.net/35-library-object-pascal-delphi-language/)
-   -   Delphi Eine klasse versiegeln (kein .net) (https://www.delphipraxis.net/28082-eine-klasse-versiegeln-kein-net.html)

maximov 19. Aug 2004 13:15


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:
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 :-D

KrasserChecker 19. Aug 2004 13:31

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;

maximov 19. Aug 2004 13:53

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 02:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz