こんにちは。なんか情けない質問な気がしますがよろしくお願いします。
クラスを作るとき、基本的にクラス内部の変数は
privateやprotectedで隠すものですが、publicにpropertyを
設定すると、メンバ変数を公開しているような気がしてなりません。
本を読むと
「プロパティは値を設定できるという点でフィールドと似ています。
ただし、フィールドが単にデータの格納場所で、値を設定したり
読み出したりすることしかできないのに対し、プロパティは
その属性に値を設定したり読み出したりする操作に対して
特定の処理を関連付けることができます。」
とありました。
・・・う〜ん違いがよくわからない・・・
自分ではなんとなく公開関数のSet〜とかGet〜に近い感覚なのですが・・・
どなたか、わかりやすい日本語で説明していただけませんでしょうか。
よろしくお願いいたします。
# 今回はちゃんとしたソースでないので、コンパイルは無理です。
たとえば、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〜を公開するようにしてもよいと思います。
> obj.SetBirthday(誕生日);
> intAge := obj.GetAge();
> Writeln(obj.Age);
よく見たら
obj.SetBirthday(誕生日);
Writeln(obj.GetAge);
でかまわないですね。
にしの様、いつもありがとうございます。
違いがなんとなくですがわかりました。
メンバ変数を公開するのはなんとなく気持ち悪いので、
プロパティを設定することにします。
Get〜、Set〜はメンバ変数が多くなるほど大変になるので、
プロパティの方が便利かな、という感じです。
ツイート | ![]() |