An alle Delphianer!!!



  • Hi!!!

    Schaut euch mal das an:

    unit Test;
    
    interface
    
    type
    TMyClass = class
       private
          zahl: Integer;
       public
          constructor Create;
          function output: Integer;
    end;
    //---------------------------------------------------------------------------
    TTester = class
       public
          myinst: TMyClass;
    
          constructor Create(num: Integer);
          destructor Destroy; override;
    end;
    
    implementation
    //---------------------------------------------------------------------------
    // TMyClass
    //---------------------------------------------------------------------------
    constructor TMyClass.Create;
    begin
       zahl := 10;
    end;
    
    function TMyClass.output: Integer;
    begin
       Result := zahl;
    end;
    //---------------------------------------------------------------------------
    // TTester
    //---------------------------------------------------------------------------
    constructor TTester.Create(num: Integer);
    begin
       myinst := TMyClass.Create;
       TMyClass(myinst).zahl := num;
    end;
    
    destructor TTester.Destroy;
    begin
       myinst.Free;
    end;
    
    end.
    

    Kann mir jemand sagen warum das hier funktioniert. Vor allem: TMyClass(myinst).zahl := num;
    obwohl wie man sieht TMyClass.zahl private ist.

    Hab im Quelltext von VCL entdeckt in der StdCtrls.pas im konstruktor von TCustomMemo steht da:

    VCL Source schrieb:

    constructor TCustomMemo.Create(AOwner: TComponent);
    begin
       ...
       FLines := TMemoStrings.Create;
       TMemoStrings(FLines).Memo := Self;
    end;
    

    und die TMemoStrings (StdCtrls.pas) sieht so aus:

    VCL Source schrieb:

    TMemoStrings = class(TStrings)
      private
        Memo: TCustomMemo;
      ...
    


  • bIce schrieb:

    myinst := TMyClass.Create;
       TMyClass(myinst).zahl := num;
    

    Wozu der Cast?

    Und guck dir doch einfach nochmal die Erklärung zu private und protected in der Sprachreferenz an, die beiden haben nämlich eine andere Bedeutung als in C++.



  • In Delphi stehen alle Klassen, die in einer Unit stehen, automatisch
    in einem friend-Verhältnis á la C++

    Und guck dir doch einfach nochmal die Erklärung zu private und protected in der Sprachreferenz an, die beiden haben nämlich eine andere Bedeutung als in C++.

    Nope. Bedeutet das gleiche wie in allen anderen Sprachen auch. Delphi fügt
    allerdings noch die Direktive published zu private/protected/public hinzu.



  • Taurin schrieb:

    In Delphi stehen alle Klassen, die in einer Unit stehen, automatisch
    in einem friend-Verhältnis á la C++

    Den Unterschied meinte ich. In C# z. B. heißt das Delphi-"private" nochmal anders ("internal private", glaube ich).



  • Also ich hab auch in der Hilfe angeschaut, da steht, dass auf Private Datenelemente von jeder Klasse innerhalb einer Unit zugegriffen werden kann. Deswegen funktioniert auch das Beispiel.

    Und zu der Frage wieso ich es im Beispiel caste ( TMyClass(myinst).zahl := num ) kann ich nur sagen weil, dass in VCL Source so steht. Ich war halt von dem Code so "geblendet", dass ich mich ausschließlich darauf konzentrierte wie man auf Private Elemente zugreifen kann. Na gut, in C++ geht es auch, aber nicht so einfach.

    Wie das aber in C# aussieht, habe ich keine Ahnung.



  • Laß den Cast mal weg, der ist Blödsinn.


Anmelden zum Antworten