クラスの詳細 つづき |
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
フィールドへの書き込みの
問題を解決しよう。
これは
アクセス権がパブリックだと、
外部から「直接」フィールドに
アクセスできることから起こる
問題だ。
直接書き換えられるのを
防げないからね。
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
うーん。
どうやれば
直接書き込めない
ようにできるかな? |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
現在は
こんな感じね。 |
 |
|
 |
これ前に
見た図だね。
フィールドと
メソッドの関係
だっけ。 |
|
|
|
 |
|
メソッドは
クラスメンバだから
プライベートの
フィールドに
アクセス可能。 |
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
直接がだめだったら、
「間接」的にアクセスさせる
ようにすればいい。
フィールドを「プライベート」に
変更して隠して。
外部からは、
メソッドを通してフィールドに
アクセスさせるんだ。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
フィールドを隠して
メソッドに代わりに
アクセスして
もらうんだ!
これなら外部は
直接操作できないね。 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
 |
メソッドは
こんな使い方も
できるんだね!
ちょっと
分かったかも。 |
|
|
|
これで解決! |
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
この間接的にフィールドに
アクセスする仕組みを使って、
自動車クラスを作り変えてみたよ。
新しく追加した
「スピードメーター」メソッドに
注目してね。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
スピードメーター機能で
代わりに速度を表示する
ようにしたんだね。
これには
読み込みする機能しか無い
から、運転手は絶対に書き込み
できないんだ。 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
 |
よかった。 |
|
|
|
|
getter(ゲッター)、setter(セッター) |
|
メソッドを通して
フィールドを
管理するの。
「プロパティ」って
言うのも同じような
仕組み。 |
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
こんな風に・・・
フィールドはプライベートにして
直接アクセスは禁止する。
外部からは、メソッドを通して
間接的にフィールドに
アクセスさせる。
こうする事で、
メソッドの作り方次第で
フィールドへのアクセスを
「読み込みのみ」、
「書き込みのみ」に
することができるよ。
この仕組みをプログラムでは
getter(ゲッター)、
setter(セッター)って言うよ。
名前だけ覚えといて。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
フィールドを間接アクセスに変更した手順(getter、setter化) |
|
1 |
フィールドをプライベートにして隠す |
2 |
隠したフィールドの「読み込み」「書き込み」はメソッドが行う。 |
3 |
メソッドをパブリックにして外部から利用できるようにする。 |
|
|
|
|
|
 |
|
 |
|
|
|
 |
いろいろな
やり方が
あるんだねー。 |
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
そしてさらに、
このやり方を発展させて
スピードメーター機能を
改良することもできる。
この例の場合、
スピードメーターメソッドは、
運転手に速度を表示する前に、
正確な速度に補正してから表示
してるんだ。 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
 |
もっと
良くしたの。 |
|
|
 |
|
なるほど。 |
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
 |
 |
|
運転手は
「結果」の速度を
受取るだけなんだ。
難しい速度の補正は
スピードメーターに
お任せなんだね。
これなら運転に集中
できるね。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
こんな風に、
アクセス権とメソッドを使って
オブジェクト内部のデータ
(フィールド)を管理するんだよ。
このフィールドとメソッドの
関係を覚えておこう。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
「フィールドとメソッドの
関係」ね!
覚えておきます。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
|
 |
関係ね。 |
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
ここまでをまとめると・・・
アクセス権は、上手く使うことで
クラス間の役割を明確にできる
んだよ。
つまり、オブジェクトの独立性や
分離性を高めることができるんだ。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
えーと、つまり・・・
運転手は、「結果」を貰うだけ。
運転手は、運転に集中する。
速度表示の管理は全部
スピードメーター機能に任せる。
これが役割分担・・・ってこと
なんだよね。
難しい・・・。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
 |
 |
 |
|
|
|
|
 |
|
|
|
|
なんとなくで
いいよ。 |
 |
|
 |
うーん。 |
|
|
|
 |
|