Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Per-Type-Class-Var? (https://www.delphipraxis.net/180803-per-type-class-var.html)

himitsu 18. Jun 2014 17:09

Delphi-Version: XE5

Per-Type-Class-Var?
 
PS: Da oben gibt es immernoch kein XE6 (wobei ich hier eher ein XE7+ gebraucht hätte :stupid:)

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
Delphi-Quellcode:
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.

Der schöne Günther 18. Jun 2014 17:27

AW: Per-Type-Class-Var?
 
Falls ich es richtig verstehe: Das fände ich alles andere als intuitiv und hätte ich auch nirgendwo so schon mal gesehen-
Ich erbe also eine statische Variable die in Wirklichkeit doch nicht geerbt ist (in der Oberklasse unbekannt)? Da führe ich die Variable doch lieber in meiner Unterklasse neu auf.

himitsu 18. Jun 2014 18:04

AW: Per-Type-Class-Var?
 
Drum ja erstmal so als Frage, ob sich das überhaupt lohnt.


Ich hatte grade noch schnell einen Code repariert, welcher nach dem ersten (falschen) Schema aufgebaut war und man wunderte sich, warum es manchmal knallt.
Nach einen Neustart des Programms ging es erstmal wieder, was bei den ersten paar auftretenden Fehler auch angewand wurde.
(es knallte ja erst bei Verwendung einer zweiten/anderen Instanz)
Nur gut, daß es bei der Vorführung bei einem neuen Kunden zufällig nicht knallte. :mrgreen:

Wie gesagt,
- theoretisch dürfte Emba sowas mit relativ wenig Aufwand einbauen können
- nja, was das Verständnis angeht ... das ist doch genau wie bei den virtuellen Methoden ... da lernt man das auch irgendwann wann und warum welche der Methoden verwendet wird.
- und von der Syntax her gibt es auch keine Probleme

Stevie 18. Jun 2014 18:40

AW: Per-Type-Class-Var?
 
Über das Thema hat schon anno 2007 Hallvard Vassbotn etwas geschrieben.

himitsu 18. Jun 2014 18:59

AW: Per-Type-Class-Var?
 
Also sooooooooooo bescheuert ist die Idee dann wohl doch nicht? :stupid:


Das mit dem VIRTUAL hinten, also ja, ich fänd es auch nich schlecht, wenn es weiter vorne steht,
aber
Delphi-Quellcode:
virtual class var
(klingt besser als sein
Delphi-Quellcode:
class virtual var
) ist von der Syntax her zu gefährlich, da ein vergessene ";" diese Position zu unsicher macht.
Bei
Delphi-Quellcode:
class specific var
müsste man sicherheitshalber ein neues reserviertes Wort einführen, was nicht unbedingt Ideal wäre.
Und das VIRTUAL dahinter ist eben absolut problemlos.

OMG, da hätte Codegear (kennt die noch wer?) das ja glatt schon einbauen können.

Und die Idee mit der VMT war dann auch nicht so verkehrt. :mrgreen:

Stevie 18. Jun 2014 19:05

AW: Per-Type-Class-Var?
 
Die Technik, die Hallvard in Part II beschreibt, wird auch von mORMot benutzt.

himitsu 18. Jun 2014 19:22

AW: Per-Type-Class-Var?
 
Zitat:

Zitat von Stevie (Beitrag 1262828)
Die Technik, die Hallvard in Part II beschreibt

Zitat:

Per-class variable in the VMT
Stimmt, Delphi hat solche Variablen ja bereits schon seit Jahrzehnten eingebaut ... nur nicht von uns direkt für eigene Variablen nutzbar :cry:

Man stelle sich mal vor mORMot könnte das nativ nutzen und müsste sich nicht verbiegen. :stupid:
Das Problem ist ja auch noch, daß es jetzt nicht mehr nur Win32 gibt und man das dann überall extra anpassen muß.

Drum wären mir native Wege eben lieber.
So wie auch bei den virtuellen Methoden. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 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