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üc
htig :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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!