# Question11 - コンストラクタと静的メンバー 本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。 ## この問題のねらい - インスタンスを作成する際に、引数の有無や内容に応じて異なる初期化処理を自動的に実行する仕組み(コンストラクタに相当)を定義し、利用できること - 特定のインスタンスに紐付かず、そのクラスの全てのインスタンス間で共有される情報(静的フィールド/クラス変数に相当)を定義し、読み書きできること - 特定のインスタンスを介さずに呼び出せる、クラス全体に属する処理(静的メソッド/クラスメソッドに相当)を定義し、呼び出せること - あるクラスのフィールドとして、別のクラスのインスタンスを保持し、それらを連携させて処理を行えること 以下の設問はそれぞれ独立したプログラムとして実装してください。 --- ## 設問1 次の仕様を満たす2つのクラスを作成してください。 - クラス名: `Wallet` - フィールド: `money`(整数) - クラス名: `User` - フィールド - `name`: 文字列 - `wallet`: `Wallet` 型 - メソッド - `useMoney`(引数: 整数 `money`、戻り値なし): `wallet` フィールドが指す `Wallet` の `money` フィールドから、引数 `money` の値を減算する。処理後、`「x(nameフィールドの値)は財布の中のお金をy(引数money)円使用しました」`と出力する - `confirmWallet`(引数なし、戻り値なし): `「x(nameフィールドの値)の財布の中の残額はy(walletフィールドが指すWalletのmoneyフィールドの値)円です」`と出力する その上で、このプログラムでは、次を行ってください。 1. `Wallet` 型の変数 `wallet` を宣言し、`Wallet` のインスタンスを代入する 2. `wallet` の `money` フィールドに `10000` を代入する 3. `User` 型の変数 `user` を宣言し、`User` のインスタンスを代入する 4. `user` の `name` フィールドに `太郎` を代入する 5. `user` の `wallet` フィールドに、1.で作成した `wallet` を代入する 6. `user` の `confirmWallet` メソッドを実行する 7. `user` の `useMoney` メソッドを、引数 `1000` で実行する 8. `user` の `confirmWallet` メソッドを再度実行する - 出力(3行): - `太郎の財布の中の残額は10000円です` - `太郎は財布の中のお金を1000円使用しました` - `太郎の財布の中の残額は9000円です` --- ## 設問2 次の仕様を満たす2つのクラスを作成してください。 - クラス名: `Wallet` - フィールド: `money`(整数) - クラス名: `Atm` - フィールド: `credit`(整数。インスタンスを作成した時点で `100000` に初期化されている) - メソッド - `withdraw`(引数: `Wallet` 型 `wallet`、整数 `money`、戻り値なし) - `credit` フィールドの値が引数 `money` より小さい場合、`「預金残高不足です。現金の引き出しに失敗しました。」`と出力する - そうでない場合、`credit` フィールドの値から引数 `money` を減算し、`wallet` の `money` フィールドに引数 `money` を加算したうえで、`「ATMの残り残高はx(減算後のcreditフィールドの値)です」`と出力する その上で、このプログラムでは、次を行ってください。 1. `Wallet` 型の変数 `wallet` を宣言し、`Wallet` のインスタンスを代入する 2. `wallet` の `money` フィールドに `10000` を代入する 3. `Atm` 型の変数 `atm` を宣言し、`Atm` のインスタンスを代入する 4. `atm` の `withdraw` メソッドを、第一引数に `wallet`、第二引数に `100000` を渡して呼び出す 5. `wallet` の `money` フィールドの値を出力する(`110000` になっていれば正解) 6. `atm` の `withdraw` メソッドを、再度同じ引数(第一引数 `wallet`、第二引数 `100000`)で呼び出す(残高不足のため引き出しに失敗するはず) 7. `wallet` の `money` フィールドの値を出力する(`110000` のまま変わっていなければ正解) - 出力(4行): - `ATMの残り残高は0です` - `110000` - `預金残高不足です。現金の引き出しに失敗しました。` - `110000` --- ## 設問3 次の仕様を満たすクラスを作成してください。 - クラス名: `Cat` - フィールド: `name`(文字列) - 初期化の仕組み(コンストラクタに相当)を2種類用意する 1. 引数なしで作成した場合: `name` フィールドに `タマ` を代入する 2. 文字列を1つ引数に取って作成した場合: `name` フィールドに、渡された引数の値を代入する その上で、このプログラムから、次を行ってください。 1. `Cat` 型の変数 `cat1` を、引数なしでインスタンス化する 2. `cat1` の `name` フィールドの値を出力する(`タマ` と出力されれば正解) 3. `Cat` 型の変数 `cat2` を、引数に `ミケ` を渡してインスタンス化する 4. `cat2` の `name` フィールドの値を出力する(`ミケ` と出力されれば正解) - 出力(2行): - `タマ` - `ミケ` --- ## 設問4 次の仕様を満たすクラスを作成してください。 - クラス名: `Student` - フィールド - `name`: 文字列(インスタンスごとに個別の値を持つ) - `group`: 文字列(特定のインスタンスに紐付かず、このクラスの全てのインスタンス間で共有される値。教室の名前を表す) - `teacher`: 文字列(`group` と同様に、全てのインスタンス間で共有される値。先生の名前を表す) - メソッド - `studentProfile`(インスタンスに対して呼び出す。引数なし、戻り値なし): `「x(nameフィールドの値)はy(groupフィールドの値)教室の生徒です。」`と出力する - `groupProfile`(特定のインスタンスを介さずに呼び出せる。引数なし、戻り値なし): `「x(groupフィールドの値)教室の担任はy(teacherフィールドの値)先生です。」`と出力する その上で、このプログラムでは、次を行ってください。 1. 生徒の名前(`name` フィールド)に `太郎` を設定する 2. 教室の名前(`group` フィールド)に `A` を設定する 3. 先生の名前(`teacher` フィールド)に `山田` を設定する 4. `studentProfile` メソッドを実行する 5. `groupProfile` メソッドを実行する - 出力(2行): - `太郎はA教室の生徒です。` - `A教室の担任は山田先生です。` --- ## 設問5 次の2つのクラスを作成してください。 - クラス名: `Jam` - フィールド: `material`(文字列) - 初期化の仕組み(コンストラクタに相当): 文字列を1つ引数に取り、`material` フィールドにその値を代入する - クラス名: `Toast` - フィールド: `jam`(`Jam` 型) - 初期化の仕組み(コンストラクタに相当): `Jam` 型の値を1つ引数に取り、`jam` フィールドにその値を代入する - メソッド: `taste`(引数なし、戻り値なし): `「x味のトーストです。」`(xは `jam` フィールドが指す `Jam` インスタンスの `material` フィールドの値)と出力する その上で、このプログラムから、次を行ってください。 1. `Jam` 型のインスタンスを、引数に `ブルーベリー` を渡して作成する 2. `Toast` 型のインスタンスを、1.で作成した `Jam` インスタンスを引数に渡して作成する 3. 2.で作成した `Toast` インスタンスの `taste` メソッドを呼び出す - 出力: `ブルーベリー味のトーストです。`