[Delphi] property vs public

0

Czesc. otoz mam takie pytanie. widze ze wiele osob uzywa tych pol, wlasciwosci czy jak to sie tam nazywa (property). ale przeciez uzycie tego ma dla mnie taki sam sens jak zmienne w sekcji "public". oczywiscie jesli mam tu na mysli zapisywanie do zmiennych typu np. integer. dlaczego wiec wskazane jest uzywanie wlasnie tego "property" a nie po prostu zmiennych publicznych?

Dzieki za wyjasnienie.

0

RTFM!

0

przeczytalem caly temat o wlasciwosciach i jakos nie znalazlem odpowiedzi na moje pytanie. poza tym to dizal "newbie" wiec chyba mam prawo pytac o takie rzeczy. jesli jednak odpowiedz na nie znajduje sie w serwisie to prosilbym o link.

1

Odpowiedź jest w pierwszym akapicie. Chodzi o to, że własności dają szansę zareagować na zamianę/odczytanie wartości. Jak ktoś odczyta/zmieni zmienną publiczną to klasa się o tym nie dowie. W przypadku własności wywoływana jest odpowiednia metoda, która zrobi z wartością co chce. Metoda może wykonać dowolną akcję, nie tylko przypisanie wartości do zmiennej czy też jej odczytanie.
Ten przykład powinien wyjaśnić:

type
TTemperatura = class
private
  FKelvin: Double;
  function GetCelsius: Double;
  function GetFahrenheit: Double;
  procedure SetCelsius(Value: Double);
  procedure SetFahrenheit(Value: Double);
public
  property Kelvin: Double read FKelvin write FKelvin;
  property Celsius: Double read GetCelsius write SetCelsius;
  property Fahrenheit: Double read GetFahrenheit write SetFahrenheit;
end;

function TTemperatura.GetCelsius: Double;
begin 
  Result := FKelvin - 273.15;
end;

function TTemperatura.GetFahrenheit: Double;
begin 
  Result := FKelvin * (9/5) - 459.67;
end;

procedure TTemperatura.SetCelsius(Value: Double);
begin 
  FKelvin := Value + 273.15;
end;

procedure TTemperatura.SetFahrenheit(Value: Double);
begin
  FKelvin := (Value + 459.67) * 5/9;
end;

Jak widzisz zmienna jest tylko jedna (FKelvin), a sporządzone własności dają możliwość korzystania z tej zmiennej w różnych jednostkach.

0

hmm... dzieki za rozjasnienie sytuacji. ale rozumiem ze:
[delphi]public
i : integer;
end;[/delphi]
oraz
[delphi]private
Fi : integer;
public
property i : integer read Fi write Fi;[/delphi]
to jedno i to samo? bo czesto widze wlasnie taki zapis zamiast tego u gory (w sensie ze bez metod tylko wlasnie takie cos).

0

O ile jednoczesne read i write z pola prywatnego mają jedynie charakter dobrego nawyku, o tyle często jedno z nich jest pomijane, co pozwala na tworzenie pól "tylko do zapisu" lub "tylko do odczytu" - z polem publicznym tego nie zrobisz.

Jak programuje się w wiele osób, to podstawowe założenie jest takie, że na zewnątrz klasy udostępniasz tylko to, co inni mogą zmienić lub przeczytać - przy takim założeniu domyślnie wszystko daje się w polach prywatnych, a jako właściwości eksponujesz tylko to, co musisz.

0

@Lut: przytoczony przez ciebie przykład faktycznie jedno i to samo. Jednak taka sytuacja zdarza się bardzo rzadko i dla wygody oraz czytelności rezygnuje się całkowicie z publicznych pól. Po prostu wiadomo, że ma ich nie być, co upraszcza interpretacje i polepsza organizację kodu. Wszystkie dane są trzymane w sekcji prywatnej (ew. protected) tak, aby tylko klasa mogła na nich pracować. Sekcja publiczna udostępnia jedynie interfejs do operowania na tych danych, taki "panel przedni", podczas gdy całe wnętrzności są ukryte w "obudowie" dla dobra użytkownika.
Poza tym zakładając publiczne pole jest prawdopodobne, że i tak się je będzie później chciało zamienić na własność, bo potrzebna będzie jakaś interakcja.

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