![]() |
Individuelle Class Var für jede abgeleitete Klasse?
Hi,
habe hier ein kleines Problem: Gegeben ist eine Basis-Listenklasse: TMyList. Diese Klasse bekommt eine Klasseneigenschaft bzw. Variable Namens 'ElementCount'. Nun gibt es abgeleitete Klassen TMyListA und TMyListB. Jede dieser Klassen soll einen individuellen Wert für ElementCount speichern. Wie mach ich das?
Delphi-Quellcode:
Ich hätte gerne, das es super ist und funktioniert.
Type
TMyList = Class Class Var ElementCount : Integer; End; TMyListA = Class (TMyList) End; TMyListB = Class (TMyList) End; ... TMyListA.ElementCount := 10; TMyListB.ElementCount := 20; If TMyListA.ElementCount <> TMyListB.ElementCount Then ShowMessage('Super, es funktioniert') else ShowMessage('So ein Mist. Class Vars sind statisch'); Ich kann das natürlich anders lösen, aber so wäre es mir am liebsten. |
Re: Individuelle Class Var für jede abgeleitete Klasse?
Äh. Das was in Pascal das keyword 'class' ist, ist in anderen Sprachen das Keyword 'static'.
Da es auch keine abstract static Methoden geben kann, ist das was Du willst so leider nicht abbildbar. |
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
Tschuldschung
Delphi-Quellcode:
Alernativ könntest du es eventuell über eine Class Property mit virtuellem Getter / Setter lösen.
TMyList = Class
End; TMyListA = Class (TMyList) Class Var ElementCount : Integer; End; TMyListB = Class (TMyList) Class Var ElementCount : Integer; End; |
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
|
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
Statische Elemente gehen ja gerade NICHT über die VMT. Zumal die ja sowieso nur für Instanzen eines Objektes gilt. Das heisst, ein override benötigt eine VMT, die nur auf einer Instanz zur Verfügung stehen. Wie willst Du dann aber auf der Klasse (eben ohne Instanz) auf das statische Property zugreifen? Das kann schon rein technisch gar nicht gehen. |
Re: Individuelle Class Var für jede abgeleitete Klasse?
|
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
TObject
Delphi-Quellcode:
TList
class function NewInstance: TObject; virtual;
Delphi-Quellcode:
class procedure Error(const Msg: string; Data: Integer); overload; virtual;
|
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
Die werden ja oftmals auch von der Klasse aus aufgerufen und nicht über ein Objekt. :gruebel: Ein Konstruktor ist im weitesten Sinne doch auch "nur" eine Klassenfunktion. [edit] getestet
Delphi-Quellcode:
type
TMyList = class class function Test: String; virtual; abstract; end; TMyListA = class(TMyList) class function Test: String; override; end; TMyListB = class(TMyList) class function Test: String; override; end; TMyListClass = class of TMyList; class function TMyListA.Test: String; begin Result := 'ich bin TMyListA'; end; class function TMyListB.Test: String; begin Result := 'ich bin TMyListB'; end; procedure TForm2.FormCreate(Sender: TObject); var x: TMyListClass; begin Memo1.Lines.Add(TMyListA.Test); Memo1.Lines.Add(TMyListB.Test); try Memo1.Lines.Add(TMyList.Test); except on E: Exception do Memo1.Lines.Add(E.Message); end; x := TMyListB; Memo1.Lines.Add(x.Test); end;
Code:
ich bin TMyListA
ich bin TMyListB Abstrakter Fehler ich bin TMyListB |
Re: Individuelle Class Var für jede abgeleitete Klasse?
Zitat:
Delphi-Quellcode:
In Ermangelung eines entsprechenden Delphis zum Testen gebe ich lieber keine Garantie, dass TDictionary da einen vernünftigen Hash rausholt :stupid: . Die Hilfe schweigt sich selbstverständlich aus.
type
TMyList = class private class var ElementCounts : TDictionary<TMyListClass, Integer>; public class property ElementCount : Integer read GetElementCount; End; ... class constructor TMyList.Create; begin ElementCounts := TDictionary.Create; end; class function TMyList.GetElementCount : Integer; begin if not ElementCounts.TryGetValue(Self, {out} Result) then Result := 0; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz