AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Object-Pascal / Delphi-Language Delphi Eine klasse versiegeln (kein .net)
Thema durchsuchen
Ansicht
Themen-Optionen

Eine klasse versiegeln (kein .net)

Ein Thema von maximov · begonnen am 19. Aug 2004 · letzter Beitrag vom 19. Aug 2004
Antwort Antwort
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, 14: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
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#2

Re: Eine klasse versiegeln (kein .net)

  Alt 19. Aug 2004, 14:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

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

Re: Eine klasse versiegeln (kein .net)

  Alt 19. Aug 2004, 14:53
Na, dann weisst du offensichtlich was du tust und bist selbst schuld ...hab ja nicht gesagt das es unmöglich ist (oder doch). Es soll ja nur verhindert werden, das andere, uninformierte personen gedankenverloren ableitungen instanzieren.
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 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