Sichtbarkeit von Objekt-Elementen

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Sichtbarkeit von Objekt-Elementen

Beitrag von Socke »

Hallo,
Ich habe hier einen Sachverhalt, den ich so nicht ganz verstehe...
[quote=Language-Reference-Guide]Private
All fields and methods that are in a private block, can only be accessed in the module (i.e. unit or program) that contains the object definition. They can be accessed from inside the object’s methods or from outside them e.g. from other objects’ methods, or global functions.
Protected
Is the same as Private, except that the members of a Protected section are also accessible to descendent types, even if they are implemented in other modules.
Public
fields and methods are always accessible, from everywhere. Fields and methods in a public section behave as though they were part of an ordinary record type.[/quote]
Demnach wäre ein Feld, das als private deklariert ist, in einem anderen Modul nicht sichtbar - auch nicht von einer abgeleiteten Klasse.
Jetzt habe ich aber etwas ausprobiert:

Code: Alles auswählen

unit contnrs;
...
  TOrderedList = class(TObject)
  private
    FList: TList;
  ...
  end;
...

Code: Alles auswählen

unit myunit;
uses contnrs;
type
  TPublicQueueList = class(TQueue)
  public
    property List: TList read FList;
  end;
...
Das ganze lässt sich wunderbar kompilieren. In Methoden kann ich auf FList aber nicht zugreifen.

Habe ich jetzt einfach etwas nicht richtig verstanden, oder bezieht sich das nicht sichtbar nur auf die Implementation (und nicht auch auf die Deklaration)?
Bitte um Aufklärung.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

Wenn ich das richtig sehe, ist das ein Bug und zwar ein etwas peinlicher :oops:
Ab in den Tracker damit http://bugs.freepascal.org/view_all_bug_page.php" onclick="window.open(this.href);return false;

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Scotty »

Ich hätte genau dieses Verhalten erwartet. Das Objekt erbt alle Eigenschaften und kann die natürlich nach Belieben publizieren. Wenn dort noch write FList; stünde, sollte ein "Zugriff" auf List auch möglich sein. Lesen hätte Socke schon ohne write können.

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

@Scotty: Imo ist das ein Fehler.
Worin würde denn nach deiner Theorie der Unterschied zw. private und protected bestehen?

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Scotty »

Gutes Argument. Interessanterweise kann man das private-Statement auch anders umgehen: http://bugs.freepascal.org/view.php?id=14534" onclick="window.open(this.href);return false;

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von pluto »

Genau das habe ich auch schon in meinen Klassen beobachtet: Ich kann auf variablen zu greifen die im Private Bereich sind, wenn ich von diesen Klassen ableite. Ich meine das ging nur in der gleichen Unit.
Worin würde denn nach deiner Theorie der Unterschied zw. private und protected bestehen?
Das habe ich mich dann auch an dieser stelle gefragt *G*
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Socke »

pluto hat geschrieben:Genau das habe ich auch schon in meinen Klassen beobachtet: Ich kann auf variablen zu greifen die im Private Bereich sind, wenn ich von diesen Klassen ableite. Ich meine das ging nur in der gleichen Unit.
Worin würde denn nach deiner Theorie der Unterschied zw. private und protected bestehen?
Das habe ich mich dann auch an dieser stelle gefragt *G*
Der Unterschied ist, dass ich in einer abgeleiteten Klasse im Implementations-Teil nicht auf private-Elemente der Eltern-Klasse zugreifen kann (außer ich hab diese vorher veröffentlicht).

Ich meine, das ist eine schöne Sache; da muss ich nicht die ganze TQueue neu kopieren um auf die Liste direkt zugreifen zu können. Andererseits sollte evtl. die Dokumentation ausgebessert werden. Wir dürfen uns also fragen, ob der Fehler jetzt im Kompiler oder in der Dokumentation zu suchen ist :)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

Socke hat geschrieben:Wir dürfen uns also fragen, ob der Fehler jetzt im Kompiler oder in der Dokumentation zu suchen ist
Eindeutig im Compiler. Trägst du den Bug nun im Tracker ein oder muss ich das machen?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Socke »

Mach du, ich hab schon genug Accounts für alles Mögliche im Internet verteilt und wieder vergessen.

Wenn das aber ein Bug ist, muss ich wohl doch meine eigene TQueue mit Zugriff auf das zugrunde liegende Listenobjekt schreiben :(
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

Fixed: http://bugs.freepascal.org/view.php?id=14650" onclick="window.open(this.href);return false;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Targion »

Hihi... Und ich habe mich schon so oft gewundert, warum ich nach Übergabe eines Pointers und derefernzierung auf alle "private" Eigenschaften des Objektes zugreifen konnte...
Das das immer so ist, hätte ich nicht gedacht. :shock:

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

Ist ja jetzt repariert.
Wenn sich jemand darauf verlassen hat, könnte er jetzt allerdings ein u.U. grösseres Problem haben :wink:

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Socke »

Wie schön, dass ich mit stable-releases arbeite :D Bis zu v. 2.4 bleibt wohl noch was Zeit
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von Socke »

Ähm... :oops: mir ist gerade etwas aufgefallen.

Code: Alles auswählen

TOrderedList = class(TObject)
private
  FList: TList;
//...
protected
//...
property List: TList read FList;
//...
das heißt, abgeleitete Klassen haben (indirekten Zugriff auf das Listenobjekt.

Heißt das fürs Ableiten, dass TMyList von der Sprache her zulässig ist, TMySecondList aber nicht?

Code: Alles auswählen

TMyList = class(TQueue)
public
  property List;
end;
TMySecondList = class(TQueue)
public
  property List: TList read FList;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Sichtbarkeit von Objekt-Elementen

Beitrag von theo »

Socke hat geschrieben: Heißt das fürs Ableiten, dass TMyList von der Sprache her zulässig ist, TMySecondList aber nicht?
In TMyList hebst du das property List nur auf ein höheres Sichtbarkeitslevel (protected->public), das ist erlaubt.
TMySecondList geht nicht. private FList sollte für eine abgel. Klasse nicht erreichbar sein, jedenfalls nicht in einer anderen Unit.

Antworten