- ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©2ch.net
584 :デフォルトの名無しさん[sage]:2016/01/09(土) 22:32:08.15 ID:N/cvH//+ - 例えば次のようなプログラムがあるとして、
class Date { public int Month { get; private set; } public int Day { get; private set; } public void SetDate(int month, int day) { Month = month; Day = day; } } class Person { public Date Birthday { get; private set; } public Person() { Birthday = new Date(); Birthday.SetDate(1, 9); } } Personクラスでは、Birthdayは外部から変更されたくなくて、参照だけを許可したいとします(※)。 このため、Birthdayのsetプロパティをprivateにしています。 しかし、Birthdayのgetプロパティが内部データへの参照を返すため、クラスを利用する側が Person man = new Person(); man.Birthday.SetDate(12, 31); とすれば、Birthdayを変更できてしまいます。 このような場合、(※)のような制約をつけたければ、どう書くのが普通なのでしょうか? Birthdayのgetプロパティで、新しいDateのインスタンスを作って、コピーを返すべきなのでしょうか? C++だと、 const Date& Birthday() { 略 } と、Get関数の戻り値に const をつければ、内容を変更できない参照を返せるのですが…。
| - ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©2ch.net
589 :デフォルトの名無しさん[sage]:2016/01/09(土) 23:06:48.44 ID:N/cvH//+ - レスありがとうございます。
例で言えば、Dateクラスのコンストラクタにmonthとday引数を用意して、そもそもSetDateなんて作らなければ いいじゃないか、と言われるかもしれませんが…。 Dateクラスは質問のために書いただけで、日付を扱うプログラムを実際に書きたいわけではありません。 質問の内容としては、 入門書には、「内部データを直接公開せずに、set/getプロパティ等を使って内部データを隠蔽しよう」 みたいなことが書かれているけど、getプロパティをprivateにしても、参照型の場合は内部データの参照を 返してしまうから、内部データ側のクラスに設定メソッドが公開されていれば、取得だけではなくて設定も されてしまう。こういう場合、一般的に、どう書くのが普通なのかな? ということなのです。
| - ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©2ch.net
590 :デフォルトの名無しさん[sage]:2016/01/09(土) 23:11:27.27 ID:N/cvH//+ - あ、間違えました。
×) getプロパティをprivateにしても、 ○) setプロパティをprivateにしても、 です。
| - ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©2ch.net
592 :デフォルトの名無しさん[sage]:2016/01/09(土) 23:50:16.69 ID:N/cvH//+ - 了解しました。
フィールドがクラス型で、それを読み取り専用にしたいというのはよくあることのような気がするのですが、 単純にはできないんですね。 せっかくsetとかgetとかの仕組みがあるのに、意外と融通が利かないものなんですね。 どうもありがとうございました!
|
|