Autor Beitrag
Dickmann
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 21.09.02 19:37 
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.

ausblenden volle Höhe 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.


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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.
ausblenden 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:

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Dickmann Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 21.09.02 22:09 
Danke Waba!
Danke Lothar!