AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

Ein Thema von s.h.a.r.k · begonnen am 17. Jun 2010 · letzter Beitrag vom 19. Jun 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 17. Jun 2010, 17:29
Delphi-Version: 2010
Hallo zusammen,

ich weiß gerade nicht wirklich, wie ich es ausdrücken soll, da ich gerade ein sprachliches (also im Bezug auf Delphi) Problem im Bezug auf folgenden Sachverhalt habe:
Delphi-Quellcode:
type
TA = class(TObject);
private
  FBlub : String;
public
  property Blub : String read FBlub write FBlub;
end;

TB = class(TA)
public
  property Blub;
end;
So, nun ist die Frage, was genau das property Blub; in der Klasse TB bewirkt. Wird die bisherige Eigenschaft überschrieben?! Ich habe es bisher einfach so hingenommen und bisher nie über Sinn und Zweck nachgedacht und prompt holt es mich ein...

Und zwar habe ich im Moment das Problem, dass wenn ich alle Properties (GetProperties, nicht GetDeclaredProperties) einer Klasse durchlaufe, RTTI mir zwei mal die gleiche Property (zumindest zwei mal den gleichen Namen) ausspuckt. Ich denke, dass sich dieses Problem mit der obigen Frage klären lässt.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 17. Jun 2010, 17:38
In deinem Beispiel im Grunde genommen nix.

Dieses kann man aber dazu nutzen, um die Sichtbarkeit von Properties zu erhöhen.

Delphi-Quellcode:
type
TA = class(TObject);
private
  FBlub : String;
protected
  property Blub : String read FBlub write FBlub;
end;

TB = class(TA)
public
  property Blub;
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#3

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 17. Jun 2010, 17:39
Warum wird das Property in der Klasse TB noch mal public definiert. Ist doch schon Public.

(Ich weis, ist keine Antwort auf deine Frage.)
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 17. Jun 2010, 19:42
In der hierarischen RTTI, also ausgehend von TB bis zur Rootklasse wird die Property für die Klasse TB sehr wohl zweimal vorkommen müssen. Entscheidend dabei ist ob bei beiden gleichnamigen Properties die exakt gleichen Getter und Setter in der RTTI hinterlegt sind. Nur dann kann man von einem "überflüssigen Duplikat" ausgehen. Allerdings könntest du ja auch für die Property in Klasse TB auf andere Getter/Setter zugreifen und somit wäre funktional diese Property eben nicht mehr identisch zur Basisklasse. Und exakt das ist der logische Sinn der Frage warum der Compiler die Property in Klasse TB erneut in der RTTI kodiert egal ob es in diesem Fall sinnvoll ist oder nicht, wichtig sind alle die anderen Fälle bei denen es nicht so ist. Mal davon abgesehen das man, wie schon richtig bemerkt, die Sichtbarkeit von Properties auf diese Weise erhöhen kann.

Gruß Hagen

Geändert von negaH (17. Jun 2010 um 19:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 17. Jun 2010, 20:53
Warum wird das Property in der Klasse TB noch mal public definiert. Ist doch schon Public.

(Ich weis, ist keine Antwort auf deine Frage.)
Ich mache das, weil ich in meinem Fall noch zusätzliche Attribute zu einer Property setze.

@negaH: Danke, exakt das hat mir bisher gefehlt, habe irgendwie nicht dran gedacht gehabt. Muss dann meine RttiHelper-Klasse doch etwas optimieren, da ich diese ja mal als veröffentlichen mag. Gibt schon einige Verbesserungen vor allem bzgl. der SetValue-Methode von TRttiProperty (in meinem neuesten Blog-Eintrag hab ich darüber ja mal was geschrieben).

Insgesamt stellt sich mir dann aber auch die Frage danach, ob ich eine Property überschreiben kann. Bin noch nie auf die Idee gekommen das zu machen. Mal schauen, was ein Testprogramm dazu sagt

Danke nochmals an alle Beteiligten des Threads
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (17. Jun 2010 um 20:55 Uhr)
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
198 Beiträge
 
Delphi XE Professional
 
#6

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 19. Jun 2010, 09:41
wenn du zusätzliche Attribute setzen willst, solltest Du den Setter überschreiben, aber nicht die Property.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 19. Jun 2010, 11:54
wenn du zusätzliche Attribute setzen willst, solltest Du den Setter überschreiben, aber nicht die Property.
Und warum so und nicht anders ?

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 19. Jun 2010, 13:40
Das mit dem Setter verstehe ich auch nicht wirklich, da dieser ja nicht wirklich was mit dem Attribut der Property zu tun hat.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

AW: Frage zu Property-Definition, RTTI liefert zwei mal gleiche Property

  Alt 19. Jun 2010, 17:05
Ich verstehe schon worauf er hinaus will. Er meint das man den Setter virtual macht und wenn man später in einer neuen abgeleiteten Klasse das Verhalten beim Setzen dieser Property verändern möchte dann überschreibt man die Setter Methode.

Allerdings
1.) Setter und Getter sind meisten privat und statisch
2.) meine ich das man das genausogut über die neue Deklaration einer gleichnamigen Property mit eigenen statisch private Setter/Getter Methoden machen kann.

Beides, sein Vorschlag und meiner, über das Überladen von Properties, sind auf Grund der Hierarchie in der Struktur der RTTI, eben dem Fall das du festgestellt hast das diese Propety mit gleichem Namen zweimal in der Objekthierarchie vorkommt, absolut gleichwertige OOP konforme Möglichkeiten.

Nun muß man beide Verfahren auf ihre Mächtigkeit hin vegleichen.

Bei seiner Methode muß man die Setter/Getter Methoden von Anfang an auf protected und virtual/dynamic deklarieren. Das kostet in der kompletten Objekthierarchie einen 4 oder 2 Bytes Slot in der VMT oder DMT. Die Klassenstruktur im gesamten Baum wird also expandiert, egal ob man in den nachfolgenden abgeleiteten Klassen jemals diese, vom Programmier der Basisklasse, angestrebte Flexibilität benutzten wird oder nicht. (speziell für die VMT gilt dies da diese immer komplett als Speicherabbild und Duplikat vererbt wird).

Macht man das aber über das Überladen der Property so entsteht folgendes Bild:
1.) Setter/Getter können weiterhin static und private sein wenn man es möchte
2.) keine Expansion der VMT/DMT mit unnötigen Slots, somit kleinere Klassenstrukturen
3.) erst wenn es wirklich notwendig wird kann der Programmierer oder jeder Andere in einer abgeleiteten Klasse die Property überladen, weil er es auch dann benötigt
4.) der somit überzeugendste Schluß ist: der Initialentwickler der Basisklassen wird von einer Verantwortung befreit sich in diesem Fall schon von Anfang an mit allen Möglich- und Unmglichkeiten zu befassen. Man gewinnt eine zusätzliche Freiheit im Klassendesign.

Gruß Hagen

Geändert von negaH (19. Jun 2010 um 17:08 Uhr)
  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:35 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