roznice miedzy Wlasciwosciami a Polami

0

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?

3
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.

0

Dodatek do powyzszego: przyklad: timer1.enabled := true; odpala timer. Gdyby bylo to zwykle pole taki zapis jedynie ustawilby to pole, a nie uruchomil timer.

2

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 GetEnabled procedury 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;

0

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

2
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1