Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit protected-deklaration


Dickmann - Sa 21.09.02 19:37
Titel: Problem mit protected-deklaration
Hi,

nachdem ich vor ein paar Tagen eine Frage zu OOP hatte und diese mit einem konkreten Beispiel darzustellen versuchte, erntete ich n'haufn Dresche. :(
Es ist wirklich keine Prüfungsaufgabe oder sowas.
In der Tat hätte ich mich mit den Schriftfarben ein wenig zurückhalten können! (BBC-Süchtig :wink: )
EGAAAAAL!

Ein Ratschlag war meine Ansätze zu posten! OK!
Währe Toll wenn mir jemand helfen könnte.

Mein Problem ist folgendes:
Warum kann ich in Unit "U_Main" nicht die Variablen sehen, die ich in der Unit "U_Erste" in der Klasse T_Erster als protected deklariert habe?
Das ich eine privat Deklaration in einer anderen Unit nicht sehen kann ist mir klar, nur bei Protected dachte ich ist man nicht innerhalb der Unit gebunden.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit U_Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  U_Erste, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Zaehler : integer;
  Erster : array of T_Erster;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Zaehler := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  inc(Zaehler);
  Setlength(Erster,Zaehler);
  Erster[Zaehler-1].Create;
  Erster[Zaehler-1].    // Warum erscheinen hier nicht die Variablen die in
                        // der Klasse T_Erster unter protected
                        // deklariert wurden?
end;

end.



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
unit U_Erste;

interface

type

  T_Erster = class
  private
    aX,aY : extended;  
  protected
    aX2,aY2 : extended; //Die sollten doch in der anderen Unit sichtbar sein
  public
    aX3,aY3 : extended; //Die sehe ich drüben; Ist klar!!!
    procedure Irgendwas_Erster(wert : integer);
  end;

implementation

uses U_Main;

procedure T_Erster.Irgendwas_Erster(wert : integer);
begin
//
end;

end.


DANKE


aogwaba - Sa 21.09.02 20:36

Hi
Zitat:
Das ich eine privat Deklaration in einer anderen Unit nicht sehen kann ist mir klar, nur bei Protected dachte ich ist man nicht innerhalb der Unit gebunden.


Ja, aber protected bezieht sich auf Klassen.

private: Member/Methoden nur sichtbar in der selben Klasse/Unit
protected:wie private und auch in abgeleiteten Klassen in verschiedenen Unit's.

cu
waba


LCS - Sa 21.09.02 21:25

Hi Dickmann
Waren die Kommentare auf deinen ersten Post wirklich so schlimm? Na gut, vielleicht hat ja auch deine Farbenfreude mit dazu beigetragen :roll:
Um auf deine Frage zu kommen:
Eine der Vorteile von Klassen ist, dass man sie gegenüber der "Aussenwelt" kapseln kann. Eine Möglichkeit um auf deine Variablen zugreifen zu können wäre, sie als Property zu deklarieren.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
type 

  T_Erster = class 
  published
   property ax: extended read faX write SetAx;
   property ay: extended read faY write SetAy;
  private 
    faX,faY : extended;  
   procedure SetAx(Value: extended);
   procedure SetAy(Value: extended);
  protected 
    aX2,aY2 : extended; 
  public 
    aX3,aY3 : extended;  
    procedure Irgendwas_Erster(wert : integer); 
  end; 
 ....

procedure T_Erster.SetAx(value: extended);
begin
  faX := Value;
end;
procedure T_Erster.SetAy(value: extended);
begin
  faY := Value;
end;

Damit sind die private Variablen vor dem direkten Zugriff von aussen geschützt, können aber als Eigenschaften gelesen und geschrieben werden. Beim Lesen wird direkt der Wert der jeweiligen Variablen gelesen, das Schreiben geschieht über die Funktionen SetAx, SetAy.

Den Code hab ich nicht getestet, sollte aber in etwa funktionieren. Vielleicht hilft dir das ja erst mal weiter.

Gruss Lothar
*dernichtnurdrescheausteilt* :beer:


Dickmann - Sa 21.09.02 22:09

Danke Waba!
Danke Lothar!