AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Individuelle Class Var für jede abgeleitete Klasse?
Thema durchsuchen
Ansicht
Themen-Optionen

Individuelle Class Var für jede abgeleitete Klasse?

Ein Thema von alzaimar · begonnen am 31. Mär 2010 · letzter Beitrag vom 31. Mär 2010
Antwort Antwort
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Individuelle Class Var für jede abgeleitete Klasse?

  Alt 31. Mär 2010, 13:26
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#2

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

  Alt 31. Mär 2010, 13:56
Ä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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 31. Mär 2010, 14:27
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

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

  Alt 31. Mär 2010, 14:42
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#5

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

  Alt 31. Mär 2010, 15:03
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#6

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

  Alt 31. Mär 2010, 15:14
Doch, das geht schon, aber umständlich..

schau mal hier
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 31. Mär 2010, 16:09
Zitat von Phoenix:
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
class function NewInstance: TObject; virtual; TList
class procedure Error(const Msg: string; Data: Integer); overload; virtual;
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 31. Mär 2010, 17:53
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.

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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

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

  Alt 31. Mär 2010, 18:38
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 . Die Hilfe schweigt sich selbstverständlich aus.
Sebastian
Moderator in der EE
  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 18:09 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