![]() |
Delphi-Version: 5
Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Hallo,
über ![]() ![]() Hier mißfällt mir etwas das OOP Konzept. Um die Ursprungsklasse mit neuen Funktionen zu erweitern leite ich sie in einer neuen Unit ab, damit die Erweiterung möglich ist, bräuchte ich aber Zugriff auf dort als private deklarierte Variablen. Warum hat eine abgeleitete Klasse nicht vollen Zugriff auf die "Oberklasse". Vor allem, weshalb geht es innerhalb der gleichen Unit und in einer Fremden Unit nicht (strict private mal außen vor, spielt in der Version keine Rolle). Den Hack zu nutzen halte ich für fragwürdig, auch wenn er hier in D5/D6 funktioniert, aber laut Blogkommentar funktioniert er nicht mehr in einer neueren Delphi Version (kann das jemand bestätigen) was eigentlich logisch ist, schließlich sollte es ja private sein (warum auch immer). Ist jetzt kein Problem der Delphi Praxis, aber in dem Tutorial ![]() Gruß relocate PS.: Im wesentlichen geht es darum, ob mal jemand testen kann, ob der Hack in späteren Delphiversionen noch funktioniert und wenn nicht, was man dann machen kann. |
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Was du in den abgeleiteten Klassen benötigst, musst du im
Delphi-Quellcode:
Abschnitt deklarieren.
protected
Warum das OOP Konzept jetzt missfällt, weil man es falsch benutzt ist mir ein Rätsel? |
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Zitat:
|
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Zitat:
Was ich eben hier nicht verstehe, wenn man die Klasse so wie sie ist nutzt, dann macht das private durchaus sinn, dass man diese Variablen von außen nicht einfach manipuliert, wenn man sie aber durch Ableiten erweitern möchte, dann muss man doch eigentlich vollen Zugriff auf die Ursprungsklasse haben. In diesem Fall hätte ja der ursprüngliche Programmierer OOP nicht verstanden, oder gemeint, diese Klasse muss man nicht mehr erweitern, man kann ja den Source selbst ändern (so hat er das auch vorgesehen, aber das ist in meinen Augen eben kein OOP). Wobei hier das nur die Randproblematik ist, also vielen Dank für die Erklärung (die unnötig war). |
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Zitat:
|
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Die Abschnitte public und published definieren die Schnittstelle für den Entwickler, der eine Komponente verwenden möchte. Der protected Abschnitt erweitert diese Schnittstelle für Entwickler, die von diese Klasse ableiten wollen. Eigentlich sollten auch spätere Versionen dieser Klasse immer mindestens die einmal veröffentlichten Properties und Methoden unterstützen.
Wenn der Entwickler es für notwendig hält, kann sich im Abschnitt private dagegen von Version zu Version alles ändern. Im Prinzip ist ein Hack für den Zugriff auf private Felder immer nur für die Versionen gültig, für die er auch erstellt wurde. Eine Garantie für zukünftige Versionen kann es nicht geben. Auf bekannte Änderungen in bestimmten Versionen kann man aber mit bedingter Kompillierung reagieren.
Delphi-Quellcode:
interface
uses Graphics; type TMyIcon = class(TIcon) private function GetImage: TIconImage; procedure SetImage(Value: TIconImage); public property Image: TIconImage read GetImage write SetImage; end; implementation uses Types; type THackIcon = class(TGraphic) // Ableitung von der selben Klasse wie TIcon public {$IFDEF VER180} // hier Felder die nur in dieser Version definiert sind {$ENDIF} FImage: TIconImage; // Felder in der selben Reihenfolge, Typ, Anzahl FRequestedSize: TPoint; end; function TMyIcon.GetImage: TIconImage; begin Result := THackIcon(Self).FImage; end; procedure TMyIcon.SetImage(Value: TIconImage); begin THackIcon(Self).FImage := Value; end; |
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Zitat:
Zitat:
Zitat:
|
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Wenn die Quellen vorhanden sind dann würde ich dort eine protected property auf das Feld erstellen. Dann geht es wieder und der Eingriff bleibt auch kontrollierbar
|
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Die Bearbeitung des Sourcecodes möchte ich vermeiden.
Und zwar, weil die ursprüngliche Unit in einer Delphiversion vorliegt und leicht abgewandelt (nicht durch mich, damit sie funktioniert) in einer Freepascalversion. Die abgeleitete Version soll nun für beide Versionen gelten, ohne eben in den Quellcode der Delphi bzw. Freepascalversion "rumzupfuschen" und damit ggf. andere es nutzen können ohne das zu müssen. Ich habe hier noch eine Option getestet und werde noch eine weitere testen in der Hoffnung einigermaßen "sauber" zu arbeiten. Gruß relocate und danke für die Antworten PS.: Könnte jemand probieren ob diese Art Hacks in späteren Delphiversionen (D7 und später) überhaupt funktionieren?! |
AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Ich kann mich dem Wunsch absolut anschließen.
Ich wollte unter VCL und FMX schon einige Bugs beseitigen oder Funktionalitäten ändern, dann waren aber private Felder nicht zugänglich oder Methoden nicht virtuell. Auf private Felder könnte man ja heutzutage notfalls über die RTTI zugreifen aber sinnvoll ist das sicher nicht. Nett wäre eine Möglichkeit, dass man die Sichtbarkeit privater Felder in Ableitungen erhöhen könnte (wie man auch öffentliche Propertys später veröffentlicht). Das Feld ist ja da. Der Compiler muss ja den Zugriff lediglich erlauben. Methoden sollten m.E. standardmäßig virtuell erzeugt werden (wenn man nicht "no virtual" deklariert). In den meisten Fällen denkt man beim basteln doch einfach nicht daran, "virtual" hinter die Deklaration zu schreiben (sofern man nicht selbst noch Ableitungen plant.) Ob der Compiler nicht nachträglich noch Möglichkeit hätte, eine normale Methode überschreibbar zu machen, bzw. dies zu emulieren, vermag ich nicht zu beurteilen. Evtl. wäre eine Deklaration "default override" ja realisierbar, wodurch der Programmierer den gleichen Zweck erfüllen könnte, intern das ganze aber anders realisiert wird. Im Detail will ich mich da nicht zu weit aus dem Fenster lehnen, das Problem sehe ich aber auch als ein solches an. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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