トップページ > プログラム > 2016年01月09日 > N/cvH//+

書き込み順位&時間帯一覧

16 位/201 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000000134



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©2ch.net

書き込みレス一覧

ふらっと 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とかの仕組みがあるのに、意外と融通が利かないものなんですね。

どうもありがとうございました!


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。