Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

Per-Type-Class-Var?

  Alt 18. Jun 2014, 18:09
Delphi-Version: XE5
PS: Da oben gibt es immernoch kein XE6 (wobei ich hier eher ein XE7+ gebraucht hätte )

Kleines billiges Beispiel:
Delphi-Quellcode:
type
  TMyBaseClass = class
  private
    class var FMyVar: TMyBaseClass;
  public
    class function CreateGlobalInstance: TMyBaseClass;
  end;

  TMyClassA = class(TMyBaseClass)
  end;

  TMyClassB = class(TMyBaseClass)
  end;

  TMyClassC = class(TMyClassB)
  end;
Hier haben ja nun alle Klassen nur die eine Variable.

Nun kann man in der Basisklasse das z.B. über ein TObjectDictionary<TMyBaseClassClass,TMyBaseClass> lösen,
oder man führt in jedem Nachfahren ein eigene Variable ein. (sowas in der Art hab ich schon paar Mal gesehn)
Delphi-Quellcode:
type
  TMyBaseClass = class
  private
    class var FMyVar: TMyBaseClass;
    class function GetMyVar: PMyBaseClass; virtual; // oder halt je ein virtueller Getter und Setter
  public
    class function CreateGlobalInstance: TMyBaseClass;
  end;

  TMyClassA = class(TMyBaseClass)
  private
    class var FMyVar: TMyBaseClass;
    class function GetMyVar: PMyBaseClass; override;
  end;
Mal so als Frage:
Wie oft wird sowas eigentlich benötigt
und wäre es nicht schöner, wenn Delphi von selber diese Variable verwalten könnte?

Mir ist grade der Gedanke gekommen, daß Delphi das eigentlich selber können dürfte und das ohne große neue Erfindungen.
Delphi-Quellcode:
type
  TMyBaseClass = class
  private
    class var FMyVar: TMyBaseClass; virtual;
  public
    class function CreateGlobalInstance: TMyBaseClass;
  end;

  TMyClassA = class(TMyBaseClass)
  private
    //class var FMyVar: TMyBaseClass; // automatisch vom Delphi erstellt
  end;
* bei Ableitungen schiebt Delphi eine implizite Kopie dieser Class-Var jeweils mit in die neue Klasse rein
* in der Basisklasse würde nun, wie bei virtiellen Methoden, ein Eintrag in der VMT mit angelegt (der Zeiger auf die Variable ist ja genauso groß, wie ein Zeiger auf 'ne Methode)
* in den Ableitungen wird dann jeweils dieser Zeiger auf die eigene Variable umgeschrieben
* beim Zugriff auf die Variable würde das dann wie bei Klassen-Feldern gehen, also mit dem Pointer aus der Klassendeklaration wird auf die richtige Variable umgeleitet.
$2B or not $2B
  Mit Zitat antworten Zitat