プロパティとフィールドの違いとは?

解決


ほーく  2003-04-12 06:14:30  No: 3310

こんにちは。なんか情けない質問な気がしますがよろしくお願いします。

クラスを作るとき、基本的にクラス内部の変数は
privateやprotectedで隠すものですが、publicにpropertyを
設定すると、メンバ変数を公開しているような気がしてなりません。

本を読むと
「プロパティは値を設定できるという点でフィールドと似ています。
  ただし、フィールドが単にデータの格納場所で、値を設定したり
  読み出したりすることしかできないのに対し、プロパティは
  その属性に値を設定したり読み出したりする操作に対して
  特定の処理を関連付けることができます。」
とありました。
・・・う〜ん違いがよくわからない・・・
自分ではなんとなく公開関数のSet〜とかGet〜に近い感覚なのですが・・・

どなたか、わかりやすい日本語で説明していただけませんでしょうか。
よろしくお願いいたします。


にしの  2003-04-12 07:15:46  No: 3311

# 今回はちゃんとしたソースでないので、コンパイルは無理です。

たとえば、Birthday: TDate;というプロパティに日付を入れて、Age:Integer;で年齢を読み出すとします。
メンバー関数だけだと、

obj.Birthday := 誕生日
obj.Age := CalcAge(obj.Birthday); 計算
Writeln(IntToStr(obj.Age));出力
となります。

プロパティで、Birthdayに対する書き込みをSetBirthdayにして、Ageを設定知るようにしておけば、
obj.Birthday := 誕生日
Writeln(obj.Age);
ですみますよね。

ちなみに、Set〜,Get〜を、propertyを使用せずに使った場合(JavaのSetter,Getterも同様)、
obj.SetBirthday(誕生日);
intAge := obj.GetAge();
Writeln(obj.Age);
となります。

比べてみてどうでしょうか。
違いはわかりませんか?

メンバ変数を使って、同じように2アクションだけで処理できるなら、メンバ変数を直接使ってもいいのではないですか?ただ、悪い設計だとは思いますが。
また、煩雑にならないのであれば、Get〜,Set〜を公開するようにしてもよいと思います。


にしの  2003-04-12 07:17:09  No: 3312

> obj.SetBirthday(誕生日);
> intAge := obj.GetAge();
> Writeln(obj.Age);

よく見たら

obj.SetBirthday(誕生日);
Writeln(obj.GetAge);

でかまわないですね。


ほーく  2003-04-13 10:08:42  No: 3313

にしの様、いつもありがとうございます。

違いがなんとなくですがわかりました。
メンバ変数を公開するのはなんとなく気持ち悪いので、
プロパティを設定することにします。
Get〜、Set〜はメンバ変数が多くなるほど大変になるので、
プロパティの方が便利かな、という感じです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加