Autor Beitrag
SwissMike
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.
ausblenden Quelltext
1:
2:
3:
public
  class procedure Initialize;
end;

_________________
Ist Zeit wirklich Geld?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 116

Suse 9.1 WinXP
D6 Pers
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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):
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 09.05.03 09:11 
Ja, werde ich wohl so machen.
Murdock1
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 12.05.03 13:53 
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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