AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

Ein Thema von relocate · begonnen am 15. Feb 2013 · letzter Beitrag vom 15. Feb 2013
Antwort Antwort
Seite 1 von 2  1 2      
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#1

Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 09:18
Delphi-Version: 5
Hallo,

über http://www.delphipraxis.net/102890-s...variablen.html bin ich auf das hier http://hallvards.blogspot.de/2004/06...te-fields.html gekommen.

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 http://www.delphi-treff.de/object-pascal/vererbung/ steht, dass die Nachfahren alles vom Vorfahren erben, was in dem Beispiel mit TMensch und TBerufstätig etc. ja nur innerhalb der selben Unit gelten würde nach dem Konzept (probiert habe ich es noch nicht) also ist die Aussage ja insofern falsch, als dass sie ja nach dem Beispiel nur innerhalb der gleichen Unit funktioniert, was man ja auch mal schreiben könnte.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:09
Was du in den abgeleiteten Klassen benötigst, musst du im protected Abschnitt deklarieren.

Warum das OOP Konzept jetzt missfällt, weil man es falsch benutzt ist mir ein Rätsel?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:14
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.
Da wir nicht Hellsehen können ob der Compiler(entwickler) hier irgendwann andere Strukturen verwendet und welche das sein werden ist hier keine Aussage möglich.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#4

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:24
Was du in den abgeleiteten Klassen benötigst, musst du im protected Abschnitt deklarieren.

Warum das OOP Konzept jetzt missfällt, weil man es falsch benutzt ist mir ein Rätsel?
Das ich das so tun müsste, ist mir klar, aber was soll ich machen, wenn der ursprüngliche Programmierer der Unit das nicht so vorgesehen hat für die Erweiterung aber notwendig ist. Ich könnte natürlich die ursprüngliche Unit bearbeiten, was in diesem Fall aufgrund der vorhandenen Source möglich wäre, aber eben die Original Unit möchte ich nicht verändern und so ist es doch auch bei OOP gedacht, dachte ich, durch Ableiten die Ursprungsklasse um neue Funktionen erweitern.

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).
  Mit Zitat antworten Zitat
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#5

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:26
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.
Da wir nicht Hellsehen können ob der Compiler(entwickler) hier irgendwann andere Strukturen verwendet und welche das sein werden ist hier keine Aussage möglich.
Womit hier aber spätere Versionen als die angegebenen D5/D6 gemeint waren die also mit D7, D8 , D200X, DXE 1 - 3 schon existieren, also zu Testen wären.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:33
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;
  Mit Zitat antworten Zitat
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#7

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 10:50
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.
Ok, das ist verständlich als reiner Anwender (auch wenn man Entwickler ist) der Komponente soll man gefälligst die Schnittstellen nutzen die vorgesehen sind. Das ist jetzt eben die Schwierigkeit und da ist es dann quasi vorbei mit der OOP wenn man eben kein Zugriff auf notwendige Daten hat, weil nicht vorgesehen.

Wenn der Entwickler es für notwendig hält, kann sich im Abschnitt private dagegen von Version zu Version alles ändern.
Gut, dass es interne Variablen geben muss, die die innere Funktion Gewährleisten okee, aber dass es keine ordentliche Möglichkeit gibt auf funktionelle Variablen zu zugreifen deren Manipulation für eine Erweiterung notwendig sind nur weil der Komponentenersteller das "fälschlicherweise" als private deklariert hat. Wobei ich hier jetzt eigentlich keine Grundsatzdiskussion lostreten wollte. Die Komponente wie sie ist wurde einfach nicht so programmiert, dass sie mittels OOP erweitert werden kann, fertig.

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.
Dafür müsste man ja aber erstmal wissen, ob er noch funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 12:51
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
relocate

Registriert seit: 26. Mai 2009
60 Beiträge
 
#9

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 13:05
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?!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Zugriff auf Private Variable aus abgeleiteter Klasse aus fremder Unit

  Alt 15. Feb 2013, 13:13
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:32 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