AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum braucht Class Property einen Static-Getter?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum braucht Class Property einen Static-Getter?

Ein Thema von himitsu · begonnen am 21. Mai 2014 · letzter Beitrag vom 21. Mai 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 12:55
Delphi-Version: XE
Tachchen,

wieso müssen bei Class-Property die Getter/Setter eigentlich Static-Class-Methods sein?

Delphi-Quellcode:
class function MyGetter: TObject; {static}
class property MyClass: TObject read MyGetter; //verlangt static
Aber durch Static gibt es dann kein Self mehr und man kann nicht mehr den Klassentyp einer abgeleiteten Klasse auslesen.
$2B or not $2B
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 13:01
Zitat:
A class field is shared between two classes that are related by inheritance. So that cannot be used for polymorphism. And a class static method also cannot supply polymorphic behaviour.

Use a virtual class function rather than a class property.
Quelle: http://stackoverflow.com/a/11013542/2298252

Kann man wohl nichts machen

Geändert von Der schöne Günther (21. Mai 2014 um 13:06 Uhr) Grund: Derp
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#3

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 13:19
Tachchen,
Aber durch Static gibt es dann kein Self mehr und man kann nicht mehr den Klassentyp einer abgeleiteten Klasse auslesen.
Und wozu sollte das gut sein? Klassenvariablen, Klassenmethoden und Klassenproperties sind schließlich Instanzunabhängig. Und da man sich auch nur auf eigene Klassenvariablen beziehen kann, ist es völlig Wumpe, ob eine Klassenmethode weiß, dass sie in einer Kindklasse aufgerufen wird.

Was hast Du denn eigentlich vor, dass Du so ein Kronstrukt benötigst?

Gruß aus dem hohen Norden
Thomas
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 13:25
Aber durch Static gibt es dann kein Self mehr
Worauf würde 'Self' denn dann eigentlich zeigen?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 13:51
Aber durch Static gibt es dann kein Self mehr
Worauf würde 'Self' denn dann eigentlich zeigen?
Es gibt kein "Self". Eine statische Klassenmethode ist wie eine ganz normale Routine.

Wie der Compiler es konkret handhabt, weiß ich gerade nicht, aber ich würde vermuten, dass er entweder sagt "undefinierter Bezeichner" oder es einfach stur durch den Klassennamen ersetzt.

Ein vernünftiger Grund, weshalb Property-Getter statisch sein müssen, fällt mir spontan nicht ein. Faulheit der Compilerentwickler?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 14:09
Nicht Static-Methoden kennen ihren Nachfahren.

Ein Property ist doch eigentlich nur ein "Alias" für den Getter, also sollte das doch mit dem Static eigentlich nichts zu tun haben

Self ist ein unsichtbarer Parameter, der als erstes in der Parameterliste drinsteht.
Nur bei Static gibt es diesen Parameter nicht. Das sieht intern wie eine "normale" Funktion, so als wäre sie nicht in einer Klasse drin.

Delphi-Quellcode:
type
  TMyClass = class
    function Method: string;
    class function ClassMethod: string;
    class function StaticMethod: string; static;
  end;

  TOtherClass = class(TMyClass);
  end;


function TMyClass.Method: string;
begin
  // Self = die Instanz (TObject)
  // ClassType = TMyClass oder TOtherClass
  Result := ClassName; // MyClassType={Self.}ClassType / MyClassType=Self.ClassType
end;

class function TMyClass.ClassMethod: string;
begin
  // Self = der Klassentyp (TClass)
  // ClassType = TMyClass oder TOtherClass
  Result := ClassName; // MyClassType=Self
end;

class function TMyClass.StaticMethod: string;
begin
  // Self gibt es nicht
  // kennt nur sich und nicht den Nachfahren
  Result := 'k.A.';
end;

Code:
MyObj.Method              TMyClass
OtherObj.Method           TOtherClass
TMyClass.Method           geht natürlich nicht
TOtherClass.Method        geht natürlich nicht

MyObj.ClassMethod         TMyClass
OtherObj.ClassMethod      TOtherClass
TMyClass.ClassMethod      TMyClass
TOtherClass.ClassMethod   TOtherClass

MyObj.StaticMethod        k.A.
OtherObj.StaticMethod     k.A.
TMyClass.StaticMethod     k.A.
TOtherClass.StaticMethod  k.A.
$2B or not $2B

Geändert von himitsu (21. Mai 2014 um 14:14 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 15:30
Es gibt kein "Self". Eine statische Klassenmethode ist wie eine ganz normale Routine.
Sagte schon himitsu und der gesunde Menschenverstand sowieso. Ich habe nur nachgefragt, denn wenn jemand die Nichtexistenz von Etwas bedauert, müsste er auch sagen können, wie dieses Etwas denn aussehen sollte, wenn es denn existieren würde, ne wahr?
Delphi-Quellcode:
Type
  TMyClass = class
    class function StaticMethod; virtual; static;
  end;
  TOtherClass = class(TMyClass)
    class fnction StaticMethod; override; static;
  end;

class function TMyClass.StaticMethod: string;
begin
   Result := 'TMyClass';
end;
class function TOtherClass .StaticMethod: string;
begin
   Result := TOtherClass ;
end;
Geht das?

Geändert von Dejan Vu (21. Mai 2014 um 15:33 Uhr)
  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
 
#8

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 15:46
Aber durch Static gibt es dann kein Self mehr
Worauf würde 'Self' denn dann eigentlich zeigen?
Bei einer Klassenmethode zeigt Self auf den aktuellen Klassentyp. So könnt eine nicht-statische Klassenmethode in etwa sowas machen:

Delphi-Quellcode:
type
  TMyBaseClass = class
  public
    class procedure Execute;
  end;

  TMyClass1 = class(TMyBaseClass);
  TMyClass2 = class(TMyBaseClass);
  

class procedure TMyBaseClass.Execute;
var
  instance: TMyBaseClass;
begin
  instance := Self.Create;
  try
    ...
  finally
    instance.Free;
  end;
end;

begin
  TMyClass1.Execute; // erzeugt ein TMyClass1
  TMyClass2.Execute; // erzeugt ein TMyClass2
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Warum braucht Class Property einen Static-Getter?

  Alt 21. Mai 2014, 15:59
Einen nicht static Getter bräuchte man, wenn class variables virtual wären.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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 19:54 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