Zugriffsebenen in Unit
lima-city → Forum → Programmiersprachen → Delphi & Pascal
abitur
attribut
behauptung
code
ebene sinn
entsprechenden funktionen
fach
frage
hinblick
http
implementation
klasse
methode
prozedur
queue
stehen
type
url
zugreifen
zugriff
-
Hallo Limas,
Ich habe eine Frage zu den Zugriffsebenen innerhalb einer Unit.
Und zwar möchte ich zwei Klassen innerhalb einer Unit definieren (K_one und K_two). Nun würde ich gerne wissen, wie die genauen Zugriffsebenen hier aussehen.
Angenommen sämtliche Methoden und Attribute von K_one sind auf private, kann K_two dann darauf zugreifen (steht ja in der selben Unit). Und wenn ja, wie müsste ich die Zugriffsebenen dann modifizieren, damit K_two darauf keinen Zugriff mehr hat (einfach von private auf protected setzen möglicherweise)?
Hier noch der Beispielcode:
Unit mBeispiel; ... class K_one = class private procedure foo_bar; end; class K_two = class public procedure irgendwas; end; implementation procedure K_two.irgendwas; var erste: K_one; begin erste.foo_bar; end; ... end.
Wäre das so möglich, wenn foo_bar in K_one auf privat steht? Und wie müsste ich den Code verändern, damit es nicht mehr möglich ist?
vielen Dank schonmal für die Antworten! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
mermadalis schrieb:
Angenommen sämtliche Methoden und Attribute von K_one sind auf private, kann K_two dann darauf zugreifen (steht ja in der selben Unit).
Nein, K_two kann nicht auf eine private Methode von K_one zugreifen, dazu muss diese als published deklariert sein.
Unit mBeispiel; procedure K_two.irgendwas; var erste: K_one; begin erste.foo_bar; end; ... end.
Würde so vermutlich nicht funktionieren, da deinen Klassen ein Contructor und ein Destructor fehlt (http://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Konstruktoren_und_Destruktoren) -
Ich habe die Frage eigentlich im Hinblick auf die Abiturvorgaben NRW 2012 gestellt. Hier werden beispielsweise einige Listenklassen angeboten (List, Queue und Stack), in denen das genannte Phänomen auftritt.
Material hierzu zu finden unter http://www.standardsicherung.nrw.de/abitur-gost/fach.php?fach=15 ("Quelltexte zu den Materialien ab 2012 - Delphi"). Ist dort im Verzeichnis "quelltexteZentralabitur/abiturklassen/listenklassen/" zu finden.
Code-Schnipsel:
UNIT mQueue; interface type TNode = class private nextNode: TNode; content: TObject; constructor create(pObject: TObject; pNext: TNode); procedure setNext(pNode: TNode); function getContent: TObject; function next: TNode; destructor destroy; override; end; TQueue = class private head: TNode; tail: TNode; public constructor create; virtual; function isEmpty: boolean; virtual; procedure enqueue(pObject: TObject); virtual; procedure dequeue; virtual; function front: TObject; virtual; destructor destroy; override; end; implementation
Wie man hier sieht sind ja alle Funktionen, Methoden und Attribute von TNode auf private gestellt. Betrachtet man nun aber die implementation von TQueue (TQueue ist ja unabhängig von TNode, außer, dass die beiden in einer Unit stehen), so fällt auf, dass scheinbar trotzdem auf die entsprechenden Funktionen und Methoden von TNode zugegriffen werden kann:
procedure TQueue.enqueue(pObject: TObject); var newNode: TNode; begin if pObject <> nil then begin newNode := TNode.create(pObject,nil); if self.isEmpty then begin head := newNode; tail := newNode; end else begin tail.setNext(newNode); tail := newNode; end; end; end;
Hier wird ja auf den constructor und die setNext-Prozedur zugegriffen, obwohl diese in TNode eigentlich private sind. Das lässt für mich nur den Schluss zu, dass meine Behauptung stimmt und innerhalb einer Unit auch unter den darin enthaltenen Klassen auf private-Elemente zugegriffen werden kann, was meinem Verständnis von public und private allerdings grundlegend widersprechen würde. Oder ich übersehe da was.
Vielleicht hat ja jemand von euch eine Idee. -
Das ist korrekt, solange beide Klassen innerhalb derselben Unit stehen, haben sie auch gegenseitigen Zugriff auf private Felder. Je nach Delphi-Version kann man solche Ebenen aber als strict deklarieren, womit man diesem Effekt dann gegenwirken kann.
type TSomeClass = class private procedure SomePrivateMethod; (* innerhalb derselben Unit verfügbar *) strict private procedure SomeStrictPrivateMethod; (* nur innerhalb der eigenen Klasse verfügbar *) end;
[edit] Nachtrag: strict macht natürlich nur für die private- und die protected-Ebene Sinn ;) [/edit]
Beitrag zuletzt geändert: 20.1.2012 15:10:32 von deddyh -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage