Einsatz der Access Modifier

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Einsatz der Access Modifier

Beitrag von Kay »

Hallo,

ich habe eine Frage zur Objektorientierung. Es gibt ja die Access Modifier private, public und protected. Das Schlüsselwort published lasse ich an dieser Stelle mal außer Acht.
Nun sollte es so sein, dass mit "public" deklarierte Eigenschaften und Methoden auch von anderen Klassen aus zugreifbar sind, als "private" nur innerhalb der eigenen Klasse und "protected" in der Klassenhierarchie. Das ist doch in Free Pascal ebenfalls so oder?
Was mich nämlich wundert ist, dass folgender Code fehlerfrei kompiliert werden kann (FPC 2.6.0) und die Anwendung einwandfrei funktioniert:

Code: Alles auswählen

interface
 
type
  TPerson = class
  private
    FFirstname: String;
    FLastname: String;
  public
    constructor Create;
  end;
 
  TAuthor = class(TPerson)
  private
    FBook: String;
    function GetText: String;
  public
    constructor Create;
    property Text: String read GetText;
  end;
 
implementation
 
constructor TPerson.Create;
begin
  FFirstname := 'Stephen';
  FLastname := 'King';
end;
 
constructor TAuthor.Create;
begin
  inherited Create;
  FBook := 'The Green Mile';
end;
 
function TAuthor.GetText: String;
begin
  Result := FLastname + ', ' + FFirstname + ': ' + FBook;
end;
Normalerweise sollte diese Implementierung doch nur funktionieren, wenn die Attribute in TPerson als "protected" deklariert sind...

Viele Grüße
Kay
Zuletzt geändert von Lori am Sa 15. Sep 2012, 12:20, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter verwenden.

Socke
Lazarusforum e. V.
Beiträge: 3188
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: Einsatz der Access Modifier

Beitrag von Socke »

Kay hat geschrieben:Nun sollte es so sein, dass mit "public" deklarierte Eigenschaften und Methoden auch von anderen Klassen aus zugreifbar sind, als "private" nur innerhalb der eigenen Klasse und "protected" in der Klassenhierarchie. Das ist doch in Free Pascal ebenfalls so oder?
Was meinst du mit "ebenfalls"?

"Private" heißt so viel wie: alles in dieser Unit darf darauf zugreifen.
"strict private" dagegen: nur diese Klasse (Nur Gültig in Verbindung mit den Schlüsselwort class; alle anderen gibt es auch bei object)
"Protected" erweitert private: alles in dieser Unit und alle abgeleiteten Klassen (in anderen Units)
"Public'" erweitert das ganze dann noch einmal: alles in dieser Unit und alle abgeleiteten Klassen und alles andere (d.h. du kannst von überall darauf zugreifen)
Der Vollständigkeit halber -- "Published": Der Compiler erzeugt Run Time Type Information (RTTI), sodass du erst zur Laufzeit wissen musst, worauf du eigentlich zugreifst (impliziert public).

Dokumenation:
http://www.freepascal.org/docs-html/ref/refse31.html
http://www.freepascal.org/docs-html/ref ... 5-750005.6
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Einsatz der Access Modifier

Beitrag von Kay »

Mit "ebenfalls" meinte ich: Wie bei anderen objektorientierten Sprachen z. B. Java oder C#.
Aber mir war nicht klar, dass sich die Begriffe in Free Pascal nicht nur auf Klassen, sondern auf ganze Units beziehen. Dann ist die Sache natürlich klar. Vielen Dank!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2897
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Einsatz der Access Modifier

Beitrag von m.fuchs »

Kay hat geschrieben:Mit "ebenfalls" meinte ich: Wie bei anderen objektorientierten Sprachen z. B. Java oder C#.
Naja, das ist nicht so leicht zu vergleichen. VB.NET kennt zum Beispiel Friend (ist wohl in C# internal). Damit kann innerhalb der selben Assembly auf di Eigenschaften und Methoden zugegriffen werden. Um etwas gleichwertiges zu haben, braucht das Framework aber eben auch ein Assembly-Konzept. Und genauso kann man das private von ObjectPascal nicht auf Sprachen übertragen, die das Unit-Konzept nicht haben.
0118999881999119725-3

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten