Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Statische Variablen in Klassen
SwissMike - Mi 07.05.03 20:40
Titel: Statische Variablen in Klassen
Hi,
ich habe eine Weile mit Java gearbeitet und beschäftige mich gerade mit Delphi / Kylix. Die Sprache an sich ist ja easy, aber wie erstelle ich statische Variablen in einer Klasse? Also Variablen (oder Felder) die nicht zum Objekt sondern zur Klasse gehören. Bei Prozeduren geht das ja einfach mit "class".
Danke!
MSCH - Mi 07.05.03 21:28
irgentwie komme ich nicht mit.
Delphi verwendet Classen. In Vorgängerversionen waren dies Objecte.
Grübel. Kannste da mal ein (java-)Beispiel posten?
grez
msch
SwissMike - Mi 07.05.03 21:33
Gut möglich dass ich jetzt es etwas mit Java vermische... ;)
Also, wenn ich in Java eine Klasse definiere, dann kann ich mit "new" ein neues Objekt dieser Klasse erstellen. Inhalte dieser Klasse (Methoden und Variablen) von jedem erzeugten Objekt selbst verwaltet. Wenn ich in der Klasse aber eine Variable mit "static" definiere, dann gehört diese zur Klasse und alle Objekte greifen auf die selben Daten zu.
Ich hoffe ich habs jetzt einigermassen rübergebracht! :)
Christian S. - Mi 07.05.03 21:38
Also, was SwissMike meint, ist folgendes:
in Java wird unterschieden zwischen Methoden und Variablen, die entweder für eine ganze Klasse von Objekten (also z.B. allen TButton) gelten und Methoden und Variablen, die eines erzeugten Objektes Bedürfen (also ein my_button : TButton, der auch mit Create erzeugt werden musste). Methoden und Variablen, die für die Klasse von Objekten gelten, werden als "static" deklariert.
Ein schönes Beispiel wäre ein Klasse TKreis, welche eine Variable Pi enthält. Da macht es keinen Sinn, erst ein Objekt der Klasse TKreis erzeugen zu müssen, um auf diese Variable zuzugreifen. Es wäre viel besser, mit TKreis.Pi auf diese Variable zugreifen zu können. Und eben das geht in Java. Das gleiche kann man auch mit Methoden machen, bei denen es nicht sinnvoll ist, erst ein Objekt dieser Klasse erzeugen zu können. Das geht auch in Delphi.
SwissMike's Frage ist nun, ob die Variante mit "static" Variablen auch in Delphi realisiert werden kann.
Meine Antwort: ich habe es noch nie gesehen. Mehr kann ich da leider nicht zu sagen.
MfG,
Peter
//edit: ah, SwissMike hat's schon selbst erklärt!
AndyB - Mi 07.05.03 21:46
Peter Lustig hat folgendes geschrieben: |
Meine Antwort: ich habe es noch nie gesehen. |
Weil es nicht möglich ist eine Klassenvariable zu deklarieren. Klassen-Methoden hingegen kann man in Delphi deklarieren.
Quelltext
1: 2: 3:
| public class procedure Initialize; end; |
Christian S. - Mi 07.05.03 21:53
Ja, das mit den Methoden kannte ich. Aber ich war mir einfach nicht sicher, wie das mit den Variablen ist. Da war ich lieber vorsichtig.
TomT - Do 08.05.03 01:03
Statische Variablen in der Art wie Java oder C# sie verwenden gibt es in Delphi nicht. Eine Möglichkeit wäre die Variable in der Unit zu deklarieren. Auf die weise ist es nicht von den einzelnen Instanzen abhängig und es gibt sie nur einmal. Ähnlich kannst Du auch mit Prozeduren und Funktionen verfahren.
Quelltext
1: 2: 3: 4: 5: 6:
| Unit Unit_Sowieso; Interface var Public_Variable: integer; Implementation var Private_Variable: integer; end. |
Motzi - Do 08.05.03 10:54
IMHO ist es auch nicht sinnvoll innerhalb einer Klasse eine Konstante zu definieren...
Udontknow - Do 08.05.03 11:44
Da möchte ich aber widersprechen. Wenn ich verschiedene Werte immer nur für Instanzen dieser Klasse & dessen Nachfahre benötige, aber nie für andere Objekte bzw. Zwecke , wäre doch so etwas wirklich schön.
Ich kenne leider nur eine Möglichkeit, eine Konstante für die Klasse zu realisieren (ähnlich wie AndyB´s Vorschlag):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| interface
type TKreis = class(TObject) private class function GetPi:Real; public property Pi:Real read GetPi; end;
implementation
class function TKreis.GetPi:Real; begin Result:=3.14159; end; |
Dieses Property ist auch einfach durch die Klasse abzugreifen, da es auf keine Variablen einer Instanz zugreift.
Cu,
Udontknow
Eisenherz - Do 08.05.03 12:10
Udontknow hat folgendes geschrieben: |
Dieses Property ist auch einfach durch die Klasse abzugreifen, da es auf keine Variablen einer Instanz zugreift. |
Wie kommst Du auf diese Idee? Ich vermute Du hast das nicht ausprobiert.
Motzi - Do 08.05.03 12:12
Zitat: |
Dieses Property ist auch einfach durch die Klasse abzugreifen, da es auf keine Variablen einer Instanz zugreift. |
Eben.. und wenn ich keine Instanz einer Klasse brauch wozu brauch ichs dann überhaupt in der Klasse? Dann kann ich dauch auch einfach eine globale Konstante definieren - entweder im interface- (public) oder eben im implementations-Teil (private)...
Udontknow - Do 08.05.03 12:26
@Eisenherz: Vielleicht ein bisschen ungeschickt ausgedrückt. Direkt aus der Klasse heraus bekommst du dann Pi über "TKreis.GetPi". Innerhalb von Objekten kannst du dann die Property benutzen. Was ich meinte ist, das man sogar "TKreis(NIL).Pi" abrufen kann.
@Motzi:
Es geht nicht darum, ob ich eine Instanz der Klasse brauche oder nicht.
Eine Klassenvariable wäre für alle Instanzen dieser Klasse abrufbar, würde aber von einer Instanz die Variable abgeändert, würden die anderen Instanzen bei Abruf ebenfalls den geänderten Wert bekommen.
Was, wenn ich noch andere Klassen in der Unit habe, die diese Werte nicht benutzen (dürfen)? So verhindere ich, daß ich solche Variablen in anderen Klassen aus Versehen benutze und/oder abändere.
Cu,
Udontknow
Motzi - Do 08.05.03 13:58
Udontknow hat folgendes geschrieben: |
[..]würde aber von einer Instanz die Variable abgeändert, würden die anderen Instanzen bei Abruf ebenfalls den geänderten Wert bekommen. |
Also wenn ich mich jetzt nicht sehr irre, dann ist in Java eine static-Variable konstant, also "read-only"...
Udontknow - Do 08.05.03 14:14
Warum heisst es dann "Variable", wenn sie nicht variabel ist? :mrgreen:
Wenn dem so ist, hast du recht, dann erübrigt sich das eigentlich.
Cu,
Udontknow
Klabautermann - Do 08.05.03 15:05
Hallo,
also ich kenne die Static Variablen nur von C++ und dort sind sie definitiv Variabel.
Ein einfaches Beispiel für den Einsatz währe ein Instanzen zähler.
Jedes Objekt dieser Klasse erhöht in seinem Construktor den (static) Zähler um ein und im Destructor wird der Wert entsprechen ernidrigt. So kann man immer anlesen, wieviele Objekte dieses Typs aktuell vorhanden sind.
Gruß
Klabautermann
SwissMike - Do 08.05.03 19:42
Hi mal wieder!
Vielen Dank für Eure Antworten. Eine statische Variable in Java ist nicht read-only. Hier der Grund wieso ich so eine statische Variable in einer Klasse will: Ich will Konstanten definieren die für bestimmte Integer Werte eingesetzt werden können. Natürlich könnte ich diese Werte einfach in einer Unit definieren. Ich finde aber, dass eine Konstante die ich im Zusammenhang mit einer bestimmten Klasse brauche nicht irgendwo herumschwirren sollte sondern klar in der jewiligen Klasse definiert sein sollte. Da ich nur auf die Konstante zugreifen will macht es natürlich auch keinen Sinn jedes Mal ein Objekt zu erzeugen. Ich werde jetzt einmal sehen wie ich das am besten mache.
Christian S. - Do 08.05.03 20:07
Dann würde ich wirklich eine class-Function einbauen, die den Wert der entsprechenden Konstanten zurück gibt. Klappt natürlich wirklich nur bei Konstanten.
SwissMike - Fr 09.05.03 09:11
Ja, werde ich wohl so machen.
Udontknow - Mo 12.05.03 14:14
Hi!
Tatsächlich wird da nicht eine Klassenvariable definiert. Swissmike wollte eine Variable nicht in der Unit deklarieren. Das geschieht aber in dem von dir gelinkten Beispiel. So kannst du ausserhalb der Klassen einfach aus jedem Objekt heraus, daß in dieser Unit auch noch deklariert ist, unabhängig davon, was für ein Objekt es ist (muss noch nicht mal ein Objekt sein), dort die Variable "Anzahl" ändern.
Cu, :)
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!