# Question12 - カプセル化 本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。 ## この問題のねらい - データ項目を外部から直接書き換えられないように保護し、決められた手段(値を設定する手段・値を取得する手段=アクセサ)を通してだけ読み書きさせられるようにすること(カプセル化) - データ項目や振る舞いには「公開範囲」を指定できること、公開範囲によって参照できる場所が変わることを理解すること ## 公開範囲についての前提 この問題では、データ項目(フィールド相当)の公開範囲として、次の2段階を区別します。 - **完全非公開**:そのクラスの内部からしか参照できない - **完全公開**:どこからでも参照できる 以下の設問はそれぞれ独立したプログラムとして実装してください。 --- ## 設問1 利用者情報を保持するデータの入れ物(以下「User」とする)を用意します。Userは次の4つの項目を保持します。 - 利用者ID(整数) - 利用者名(文字列) - メールアドレス(文字列) - パスワード(文字列) ### 要件 - 上記4つの項目は、いずれも**完全非公開**にしてください。 - 4つの項目それぞれについて、値を設定する手段と値を取得する手段(アクセサ)を用意し、これらは**完全公開**にしてください。 - 呼び出し側のプログラムでは、Userのインスタンスを生成し、各項目に直接値を代入するのではなく、用意した「値を設定する手段」を通じて次の値を設定してください。 - 利用者ID:`1000` - 利用者名:`リゾーム太郎` - メールアドレス:`rhizome@hogehoge.com` - パスワード:`12345` - 続けて、「値を取得する手段」を通じて4項目の値を取得し、次の形式で出力してください(各行の項目名と値の間の空白・全角文字はそのまま再現すること)。 ``` ID :1000 名前 :リゾーム太郎 メールアドレス  :rhizome@hogehoge.com パスワード  :12345 ``` --- ## 設問2 名称(文字列)を1つだけ保持するデータの入れ物(以下「Item」とする)を作成してください。名称は**完全非公開**にし、初期値は `アイテムA` としてください。 その上で、次の処理を行う呼び出し側のプログラムを作成してください。 1. Itemのインスタンスを生成する 2. 生成したインスタンスの名称の値を、そのまま出力する 上記の状態では、Itemの名称の項目が**完全非公開**に設定されているため、呼び出し側から値を直接参照できず、コンパイル(実行)エラーになります。 ### 要件 - Itemに、名称の値を取得する手段(アクセサ)を追加してください。名称の項目自体は**完全非公開**のまま変更しないこと。 - 呼び出し側のプログラムを、名称の値を直接参照するのではなく、追加した「値を取得する手段」を通じて取得・出力するように修正し、エラーが出ないようにしてください。 - 期待される出力:`アイテムA`