Autor |
Beitrag |
SwissMike
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 07.05.03 20:40
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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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; |
_________________ Ist Zeit wirklich Geld?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
TomT
      
Beiträge: 116
Suse 9.1 WinXP
D6 Pers
|
Verfasst: 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. |
_________________ ...und da wurde mir klar, dass eine Toolbar keine Kneipe für Heimwerker ist.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 08.05.03 10:54
IMHO ist es auch nicht sinnvoll innerhalb einer Klasse eine Konstante zu definieren...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 48
|
Verfasst: 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.
_________________ aloa Eisenherz
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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)...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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"...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 08.05.03 14:14
Warum heisst es dann "Variable", wenn sie nicht variabel ist?
Wenn dem so ist, hast du recht, dann erübrigt sich das eigentlich.
Cu,
Udontknow
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
SwissMike 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 09.05.03 09:11
Ja, werde ich wohl so machen.
|
|
Murdock1
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 12.05.03 13:53
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
|
|