# Question20 - インスタンスの基本操作 本資料の練習問題は、複数のプログラミング言語(Java / C# / PHP / Python)で共通して利用できるよう記述されています。静的型付け・動的型付けの違いや文字列の連結ルールなど、言語固有の文法仕様に基づき、問題文の表現をご使用の言語の仕様に適宜読み替えて進めてください。 ## この問題のねらい - 変数が保持する値どうしを比較するとき、見た目上の作られ方(新しく作られたものか、既存の値への参照か)に関わらず、「内容が等しいかどうか」を正しく判定できること - 独自に定義したデータについて、どのような基準を満たせば「等しい」とみなすか(フィールドの値がすべて一致するか等)を、自分で定義できること - 既存のインスタンスをもとに、独立した複製(コピー)を作成できること。その際、複製先が元のインスタンスとは別の実体になること、および内部に保持している別のデータについても複製の対象に含める必要があること(参照をそのまま使い回すだけでは、本当の意味での複製にはならないこと)を理解していること 以下の設問はそれぞれ独立したプログラムとして実装してください。設問2は共通データ定義「利用者データ」を、設問3は共通データ定義「犬データ」「おもちゃデータ」を使用します。 --- ## 設問1 次の3つの変数を用意してください。 - `str`: 文字列 `"Hello"` を保持する変数 - `str2`: `str` とは別に、新たに作成した文字列 `"Hello"` を保持する変数(`str` の値をそのままコピーして使うのではなく、`str` とは独立に、あらためて `"Hello"` という内容の値を作成すること) - `str3`: `str2` と同じ値を指す変数(`str3` に `str2` を代入する) 次の3組について、それぞれの内容が等しいかどうかを判定し、結果を出力してください。いずれも `true` と表示されることが期待されます。 1. `str` と `str2` 2. `str2` と `str3` 3. `str` と `str3` - 出力(3行): ``` true true true ``` - 補足: 見た目上は同じ内容の値であっても、変数がどのように作られたか(新しく作られたものか、既存の値をそのまま参照しているものか)によっては、実体そのものが同一かどうかを判定する方法では異なる結果になる場合があります。ここでは常に「内容が等しいかどうか」で比較してください。 --- ## 共通データ定義: 利用者データ(設問2で使用) 次の3つのフィールドを持つデータを表せるようにしてください(いずれも完全非公開にし、取得・設定用の手段(アクセサ)を用意すること)。 - 名前(文字列) - メールアドレス(文字列) - パスワード(文字列) コンストラクタ(初期化の手段)で、上記3つのフィールドすべてを初期化できるようにしてください。 ## 設問2 共通データ定義「利用者データ」のインスタンスを、次の同じ内容で2つ作成してください。 - 名前: 田中太郎 - メールアドレス: tanaka@hoge.com - パスワード: password01 2つの利用者データのインスタンスを、内容が等しいかどうかで比較すると `true` と表示されるように、「利用者データ」の定義に手を加えてください。 - 具体的には、名前・メールアドレス・パスワードの3つのフィールドの値がすべて一致する場合に、2つの利用者データのインスタンスを「等しい」と判定する仕組みを、利用者データの定義自体に組み込んでください(既定の等価性判定が実体の同一性のみで比較するものである場合、それを上書き・変更する必要があります) - 出力(1行): ``` true ``` --- ## 共通データ定義: 犬データ・おもちゃデータ(設問3で使用) 「おもちゃデータ」として、次のフィールドを持つデータを表せるようにしてください(完全非公開にすること)。 - おもちゃの一覧(文字列の一覧) コンストラクタで、おもちゃの一覧を初期化できるようにしてください。取得・設定用の手段(アクセサ)も用意してください。 「犬データ」として、次のフィールドを持つデータを表せるようにしてください(いずれも完全非公開にすること)。 - 名前(文字列) - 年齢(整数) - おもちゃデータ(1つ) コンストラクタで、上記3つのフィールドすべてを初期化できるようにしてください。取得・設定用の手段(アクセサ)も用意してください。 ## 設問3 「犬データ」のインスタンスを1件、次の内容で用意してください。 - 名前: 太郎 - 年齢: 10 - おもちゃデータ: おもちゃの一覧として「ボール」「フリスビー」「骨」を持つもの 用意したインスタンス(変数 `dog` とする)をもとに、独立した複製を作成する機能を「犬データ」の定義に用意し、それを使って複製(変数 `dog1` とする)を作成してください。 1. `dog` と `dog1` が、実体として同一かどうかを比較すると、`false`(別の実体である)と判定されるようにしてください 2. `dog` が持つ「おもちゃデータ」のインスタンスと、`dog1` が持つ「おもちゃデータ」のインスタンスについても、実体として同一かどうかを比較すると、`false`(別の実体である)と判定されるようにしてください。そのためには、犬データのインスタンスを複製する際に、内部に保持しているおもちゃデータのインスタンスも合わせて複製の対象に含める必要があります(おもちゃデータのインスタンスへの参照をそのままコピーするだけでは、元の犬データのインスタンスと複製後の犬データのインスタンスが同じおもちゃデータのインスタンスを共有してしまい、この判定が `true` になってしまいます) - 出力(2行): ``` false false ``` - 補足: 使用する言語に、既存のインスタンスから複製を作成する標準的な仕組み(Javaでいう `Object` クラスの複製機能に相当するもの)があれば、それを使ってください。無ければ、フィールドの値を1つずつ新しいインスタンスにコピーするなど、同等の効果が得られる方法で代用してよい。