Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Individuelle Class Var für jede abgeleitete Klasse? (https://www.delphipraxis.net/149828-individuelle-class-var-fuer-jede-abgeleitete-klasse.html)

alzaimar 31. Mär 2010 12:26


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:
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 hätte gerne, das es super ist und funktioniert.

Ich kann das natürlich anders lösen, aber so wäre es mir am liebsten.

Phoenix 31. Mär 2010 12:56

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.

himitsu 31. Mär 2010 13:27

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von alzaimar
Wie mach ich das?

Ich konnte grade nicht anders.
Tschuldschung
Delphi-Quellcode:
TMyList = Class
End;

TMyListA = Class (TMyList)
  Class Var ElementCount : Integer;
End;

TMyListB = Class (TMyList)
  Class Var ElementCount : Integer;
End;
Alernativ könntest du es eventuell über eine Class Property mit virtuellem Getter / Setter lösen.

Neutral General 31. Mär 2010 13:42

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von himitsu
Alernativ könntest du es eventuell über eine Class Property mit virtuellem Getter / Setter lösen.

Das funktioniert nicht. Wäre auch irgendwie komisch, wenn es funktionieren würde. Dann muss es schon eine normale Property sein.

Phoenix 31. Mär 2010 14:03

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von himitsu
Alernativ könntest du es eventuell über eine Class Property mit virtuellem Getter / Setter lösen.

Als Ergänzung zu Michaels Antwort:
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.

webcss 31. Mär 2010 14:14

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Doch, das geht schon, aber umständlich..

schau mal hier

Uwe Raabe 31. Mär 2010 15:09

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von Phoenix
Zitat:

Zitat von himitsu
Alernativ könntest du es eventuell über eine Class Property mit virtuellem Getter / Setter lösen.

Als Ergänzung zu Michaels Antwort:
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.

Aber virtuelle Klassenmethoden gehen schon! Z.B.:

TObject
Delphi-Quellcode:
class function NewInstance: TObject; virtual;
TList
Delphi-Quellcode:
class procedure Error(const Msg: string; Data: Integer); overload; virtual;

himitsu 31. Mär 2010 16:53

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von Phoenix
Als Ergänzung zu Michaels Antwort: ...

Aber wie geht das dann mit den virtuellen Konstruktoren?
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

Khabarakh 31. Mär 2010 17:38

Re: Individuelle Class Var für jede abgeleitete Klasse?
 
Zitat:

Zitat von Phoenix
Äh. Das was in Pascal das keyword 'class' ist, ist in anderen Sprachen das Keyword 'static'.

Nur dass es in Pascal so etwas wie Metaklassen gibt...

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


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