Witam, zaczynam przygode z delphi z nastawieniem na obiektowosc.
Mozektos mi podac logiczne wyjasnienie pytania:
jaki jest sens sotosowania wlasciwosci PROPERTY w klasach, skoro sa zwykle pola.
Moze jakies przyklady?
Witam, zaczynam przygode z delphi z nastawieniem na obiektowosc.
Mozektos mi podac logiczne wyjasnienie pytania:
jaki jest sens sotosowania wlasciwosci PROPERTY w klasach, skoro sa zwykle pola.
Moze jakies przyklady?
kuskatorr napisał(a):
Witam, zaczynam przygode z delphi z nastawieniem na obiektowosc.
Mozektos mi podac logiczne wyjasnienie pytania:
jaki jest sens sotosowania wlasciwosci PROPERTY w klasach, skoro sa zwykle pola.
Moze jakies przyklady?
Taki jest sens że możesz ograniczyć je tylko do zapisu albo odczytu, możesz napisać metodę która poza ustawieniem wartości zrobi coś jeszcze i która będzie jedynym zewnętrznym sposobem dostępu do wartości. I property sama w sobie polem nie jest.
Dodatek do powyzszego: przyklad: timer1.enabled := true; odpala timer. Gdyby bylo to zwykle pole taki zapis jedynie ustawilby to pole, a nie uruchomil timer.
To ja jeszcze dorzucę coś od siebie;
Tak jak napisał @-123oho i @krwq - właściwość to nie jest zwykłe pole; Sensem jest właśnie ograniczenie dostępu i podczas zmiany jego zawartości można wykonać coś jeszcze; Popatrz na takią właściwość:
TFoo = class(TObject)
private
FEnabled: Boolean;
protected
function GetEnabled(): Boolean;
procedure SetEnabled(State: Boolean);
public
property Enabled: Boolean read GetEnabled write SetEnabled;
end;
{...}
function TFoo.GetEnabled(): Boolean;
begin
Result := FEnabled;
{ POZOSTAŁE OPERACJE }
end;
procedure TFoo.SetEnabled(State: Boolean);
begin
FEnabled := State;
{ POZOSTAŁE OPERACJE }
end;
W takim wypadku możesz wykorzystać właściwość Enabled
zarówno do zapisu jak i odczytu; Jeśli oprogramujesz odpowiednio procedurę SetEnabled
i funkcję GetEnabled
będziesz miał możliwość zrobienia czegokolwiek innego poza samym wpisaniem lub odczytaniem wartości pola FEnabled
; Tak, FEnabled
to pole, Enabled
do właściwość;
Można także ograniczyć dostęp do pola FEnabled
przez odpowiednią deklarację właściwości, np. żeby możliwy był jedynie odczyt pola FEnabled
wystarczy w deklaracji właściwości usunąć część z write
:
{...}
public
property Enabled: Boolean read GetEnabled;
Deklarację funkcji procedury GetEnabled
SetEnabled
trzeba usunąć z deklaracji klasy; Aby pozostawić pole jedynie do zapisu (żadziej się to stosuje) trzeba wprowadzić modyfikację deklaracji właściwości analogicznie do powyższego - usunąć część z read
:
{...}
public
property Enabled: Boolean write SetEnabled;
No i oczywiście deklarację (definicję raczej też) funkcji GetEnabled
trzeba wyrzucić;
Tak więc zapamiętaj sobie, że właściwości są bardzo potrzebne, jeśli chce się przydzielić / ograniczyć dostęp do pól w klasie; Inaczej programista będzie miał pełne możliwości co może skutkować późniejszymi błędami;
ok, dzieki chlopaki.
Mimo wszystko jak nie chce wykonywac zadnych operacji dodatkowych oprocz *przypisan oraz niekoniecznie zalezy mi na blokowaniu zapisu/odczytu to rozumiem, ze PROPERTY moge pominac i stosowac zwykle pola?
thx
kuskatorr napisał(a):
Mimo wszystko jak nie chce wykonywac zadnych operacji dodatkowych oprocz *przypisan oraz niekoniecznie zalezy mi na blokowaniu zapisu/odczytu to rozumiem, ze PROPERTY moge pominac i stosowac zwykle pola?
Generalnie tak, sam często tak robię a property stosuję w przypadku ważniejszych pól albo przerabiam pole na property w późniejszym czasie. Nie mówię że jest to najlepsze rozwiązanie ale do wyczucia kiedy co stosować dojdziesz tylko kodząc. Po prostu stosuj to co uważasz za adekwatne.