kostenloser Webspace werbefrei: lima-city


Zugriffsebenen in Unit

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    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!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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)
  4. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    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.
  5. 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
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!