Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi <> Java : static class (https://www.delphipraxis.net/95666-delphi-java-static-class.html)

Bomberbb 11. Jul 2007 09:24


Delphi <> Java : static class
 
Hallo,
ich lerne z.Zt. Java und oop. Ich würde gerne ein wenig erlerntes nun auch in Delphiprogrammen unterbringen.

Ich würde nun gerne die Variablen als Objekt defnieren, so dass ich z.B.
Methoden wie

MyString.ConvertFromInt(10);

definieren und aufrufen kann. Bei java gibt es nun das schlüsselwort 'static', so dass auf Objekte der Klasse auch ohne vorheriges Erzeugen (new) zugegriffen werden kann. Gibt es in Delphi(5) etwas ähnliches oder muss ich immer mit 'MyString.create' und 'MyString.free' arbeiten.

Gruß

BomberBB

mkinzler 11. Jul 2007 09:26

Re: Delphi <> Java : static class
 
Es gibt zwar keine statiische Klassen aber statische Methoden, welche in Delphi Klassenmethoden heißen.

Die Muhkuh 11. Jul 2007 09:41

Re: Delphi <> Java : static class
 
Hi Bomberbb,

Delphi-Quellcode:
type
  TClass = class(TObject)
  public
    class function GetSomething: String;
  end;

class function TClass.Getsomething: String;
begin
  Result := 'Something';
end;

// ......

ShowMessage(TClass.GetSomething);
so kannst du es direkt aufrufen, ohne erst mit TClass.Create bzw. .Free zu arbeiten.

Bomberbb 11. Jul 2007 11:01

Re: Delphi <> Java : static class
 
Nun, wenn ich nur Methoden aufrufe hat das bei mir auch schon funktioniert.
Wie aber bekomme ich das auch mit Attributen hin.

Habe mit das so gedacht...
Delphi-Quellcode:
type
  TClass = class(TObject)
  private
    value :String;
  public
    class function GetSomething: String;
  end;

class function TClass.Getsomething: String;
begin
  Result := 'GetsomeThing';
end;

// ......
var
  test: TClass;
Begin
  ShowMessage(test.GetSomething);
  test.value:=5; //hier kommt ohne Create die Zugriffsverletzung

jbg 11. Jul 2007 11:28

Re: Delphi <> Java : static class
 
Klassen-Eigenschaften/Variablen/Konstanten gibt es erst ab Delphi 2006.

3_of_8 11. Jul 2007 12:09

Re: Delphi <> Java : static class
 
...du kannst die Variablen allerdings in einen globalen Record auslagern, was dann ungefähr so ähnlich ist wie eine Klassenvariable. (zumindest so ähnlich aussieht. ;) )

Bomberbb 11. Jul 2007 13:10

Re: Delphi <> Java : static class
 
@ 3_of_8
Mir gehts im wesentlichen um die Vererbung, die bei Rekords ja nicht gegeben ist.

@jbg wie sähe das denn aus unter 2006: bin eh am überlegen, ob ich mir Turbodelphi kaufe.

mkinzler 11. Jul 2007 13:31

Re: Delphi <> Java : static class
 
Zitat:

wie sähe das denn aus unter 2006:
Win unter #2+#3 beschrieben

Oxmyx 11. Jul 2007 13:54

Re: Delphi <> Java : static class
 
Man kann eine Klasse in Java zwar als static deklarieren, allerdings hat dies einen anderen Effekt: Dadurch wird eine verschachtelte Klasse zu einer Top-Level-Klasse erhoben.

jbg 11. Jul 2007 17:11

Re: Delphi <> Java : static class
 
Zitat:

Zitat von Bomberbb
@jbg wie sähe das denn aus unter 2006: bin eh am überlegen, ob ich mir Turbodelphi kaufe.

Delphi-Quellcode:
type
  TTest = class(TObject)
  private class var
    FMyProp: Integer;
    FMySecondProp: string;
  public
    class function DoSomething: Integer; static; { eine echte statische Methode ohne versteckten Self: TClass Parameter }
    class property MyProp: Integer read FMyProp write FMyProp;
    class property MySecondProp: string read FMySeondProp write FMySecondProp;
  end;

Hawkeye219 11. Jul 2007 18:14

Re: Delphi <> Java : static class
 
Hallo,

bei der Verwendung von Klassenvariablen und -konstanten muß beachtet werden, daß sich alle Instanzen eine Variable bzw. Konstante teilen:

Delphi-Quellcode:
type
  TTest = class (TObject)
  private class var
    FMyProp: Integer;
  public
    class property MyProp: Integer read FMyProp write FMyProp;
  end;

var
  T1, T2 : TTest;
begin
  T1.MyProp := 42;
  T2.MyProp := 0;
  ShowMessage (IntToStr(T1.MyProp)); // Ausgabe: '0'!
end;
Das von BomberBB gewünschte Verhalten läßt sich (in allen Delphi-Versionen) mit Objekttypen realisieren, die auch eine Vererbung ermöglichen:

Delphi-Quellcode:
type
  TString = object
  private
    FValue : string;
  public
    procedure ConvertFromInt (aNumber: Integer);
    property Value: string read FValue write FValue;
  end;

procedure TString.ConvertFromInt (aNumber: Integer);
begin
  Value := IntToStr(aNumber);
end;

var
  MyString : TString;
begin
  MyString.ConvertFromInt(42);
  ShowMessage (MyString.Value);
end;
Eine Warnung sei aber angebracht:

Zitat:

Zitat von Delphi-Hilfe
Objekttypen werden nur aus Gründen der Abwärtskompatibilität unterstützt. Ihre Verwendung unter Win32 ist nicht zu empfehlen. Vom Delphi .NET-Compiler werden sie nicht akzeptiert.

Man sollte also nicht darauf vertrauen, daß auch zukünftige Delphi-Versionen die Objekttypen unterstützen. Das BDS bietet einen Ersatz in Form der erweiterten Record-Typen (leider ohne Vererbung).

Gruß Hawkeye

jbg 11. Jul 2007 18:35

Re: Delphi <> Java : static class
 
Zitat:

Zitat von Hawkeye219
Das BDS bietet einen Ersatz in Form der erweiterten Record-Typen (leider ohne Vererbung).

Also wenn ich mich recht entsinne, kann man unter Delphi.NET von Record-Typen erben. Das hat mich nämlich schon geärgert, dass das Win32 "object" nun unter Delphi.NET als "record" bezeichnet wird. Warum konnte man nicht das "alte" object benutzen statt nun für "ValueType" das Schlüsselwort "record" zu benutzen. Ich glaube ich sollte ein neues Feature in meine DLangExtensions packen, dass unter .NET jedes "typename = object" durch "typename = record" ersetzt, womit man dann das "object" in .NET benutzen kann. :wall:

Bomberbb 12. Jul 2007 07:34

Re: Delphi <> Java : static class
 
@Hawkeye219

Danke, genau das hab ich gesucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz