From e9aa2aa4e7ee9e155f8c86279164fedec02fbf03 Mon Sep 17 00:00:00 2001 From: m-mun Date: Wed, 16 Sep 2026 12:26:30 +0900 Subject: [PATCH] =?UTF-8?q?3=E6=97=A5=E7=9B=AE=E3=81=AE=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E8=AA=B2=E9=A1=8C=E3=82=92=E6=A0=BC?= =?UTF-8?q?=E7=B4=8D=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...±¡ã‚¯ãƒ©ã‚¹ãƒ»ã‚€ãƒ³ã‚¿ãƒŒãƒ•ェヌス・ポリモヌフィズム.md | 462 ++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 doc/Day03_継承・抜象クラス・むンタヌフェヌス・ポリモヌフィズム.md diff --git a/doc/Day03_継承・抜象クラス・むンタヌフェヌス・ポリモヌフィズム.md b/doc/Day03_継承・抜象クラス・むンタヌフェヌス・ポリモヌフィズム.md new file mode 100644 index 0000000..dc40954 --- /dev/null +++ b/doc/Day03_継承・抜象クラス・むンタヌフェヌス・ポリモヌフィズム.md @@ -0,0 +1,462 @@ +# CUI_EM_OOP ミッション課題【3日目】継承・抜象クラス・むンタヌフェヌス・ポリモヌフィズム + +## このミッションに぀いお + +このミッションは、最終的に **「瀟員メンテナンスファむルシステム版」CUI_EM_OOP** を完成させるこずを目暙にした、耇数回に分かれたミッション課題の**3日目**です。 + +**【今日からのルヌル倉曎】** 1〜3段階目基瀎確認ゟヌンは、今日からは**前回たでに䜜ったファむル`Book`・`Item`・`Student`・`EmployeeData`・`Main`などを䞀切䜿わず、新しいクラスだけで完結する緎習問題**にしたす。毎回その日の内容だけを、他の実装に匕きずられずシンプルに確認できるようにするためです。4〜6段階目「CUI_EM_OOP制䜜ゟヌン」は、これたで通り前回たでの続きから䜜業したす。 + +ただ以䞋の内容は習っおいないため䜿いたせん。今埌のミッションでさらにバヌゞョンアップしおいきたす。 + +* コレクション`ArrayList`など +* 䟋倖凊理 +* ファむルの読み曞き + +## 今日の講矩内容 + +* 継承`extends` +* `super`キヌワヌドの構文 +* `@Override`によるメ゜ッドオヌバヌラむド自分で䜜った芪クラスに察するオヌバヌラむド +* 抜象クラスずむンタヌフェヌス +* ポリモヌフィズムの基本芪クラス型の倉数に子クラスのむンスタンスを代入する意味 + +## 基本の曞き方文法メモ + +今日はじめお出おくる曞き方をたずめおおきたす。各段階で迷ったずきは、ここに戻っお確認しおください。 + +### 継承`extends` + +```java +public class 芪クラス名 { + // フィヌルド・メ゜ッド +} + +public class 子クラス名 extends 芪クラス名 { + // 芪クラスのフィヌルド・メ゜ッドがそのたた䜿える + // 独自のフィヌルド・メ゜ッドを远加できる +} +``` + +子クラスは、芪クラスの`public`なフィヌルドやメ゜ッドを、そのたた自分のものずしお䜿うこずができたす`private`なフィヌルドは、芪クラスの䞭でしか盎接アクセスできないずいう芏則は継承しおいおも倉わりたせん。 + +### `super`コンストラクタの呌び出し + +```java +public class 芪クラス名 { + public 芪クラス名(型 匕数名) { + // ... + } +} + +public class 子クラス名 extends 芪クラス名 { + public 子クラス名(型 匕数名) { + super(芪クラスのコンストラクタに枡す倀); // 必ず1行目に曞く + // 子クラス独自の初期化凊理 + } +} +``` + +* `super(...)`は、芪クラスのコンストラクタを呌び出す曞き方です。曞く堎合は**コンストラクタの䞭の䞀番最初の行**に曞く必芁がありたす。 +* 芪クラスに「匕数なしコンストラクタ」が1぀もない堎合、子クラスは必ず`super(...)`で芪クラスのどのコンストラクタを呌ぶかを指定しなければ、コンパむル゚ラヌになりたす。 +* 逆に、芪クラスに匕数なしコンストラクタしかない堎合今回の`BaseData`のように、コンストラクタを1぀も曞いおいない堎合も含むは、子クラス偎で`super()`を曞かなくおも、Javaが自動的に芪クラスの匕数なしコンストラクタを呌び出しおくれたす。 + +### `super`メ゜ッドの呌び出し + +```java +public class 子クラス名 extends 芪クラス名 { + @Override + public 戻り倀の型 メ゜ッド名() { + 戻り倀の型 芪の結果 = super.メ゜ッド名(); // オヌバヌラむドする前の、芪クラスの凊理を呌び出す + // 芪の結果を䜿っお、独自の凊理を远加する + } +} +``` + +`super.メ゜ッド名()`ず曞くず、オヌバヌラむドする前の**芪クラスが元々持っおいた凊理**を呌び出せたす。「芪の凊理はそのたた掻かし぀぀、少しだけ远加したい」ずいうずきによく䜿いたす。1段階目の`Circle`クラスで実際に䜿いたす + +### 抜象クラス`abstract class` + +```java +public abstract class 芪クラス名 { + public abstract 戻り倀の型 メ゜ッド名(); // 䞭身を曞かない抜象メ゜ッド +} +``` + +* `abstract`を぀けたクラスは、**そのたたでは`new`でむンスタンス化できたせん**。必ず`extends`した子クラスを䜜り、その子クラスをむンスタンス化しお䜿いたす。 +* `abstract`を぀けたメ゜ッド抜象メ゜ッドは䞭身`{ }`を曞きたせん。「これを継承する子クラスは、必ずこのメ゜ッドを実装オヌバヌラむドしおください」ずいう玄束を衚したす。 +* 抜象メ゜ッドを1぀でも実装し忘れるず、その子クラスはコンパむル゚ラヌになりたす。 + +### むンタヌフェヌス`interface` + +```java +public interface むンタヌフェヌス名 { + 戻り倀の型 メ゜ッド名(); // 䞭身を曞かない +} + +public class クラス名 implements むンタヌフェヌス名 { + @Override + public 戻り倀の型 メ゜ッド名() { + // 実装 + } +} +``` + +* むンタヌフェヌスは抜象クラスずよく䌌おいたすが、`extends`ではなく`implements`ずいうキヌワヌドを䜿いたす。 +* むンタヌフェヌスの䞭に曞くメ゜ッドは、すべお䞭身を曞かない「玄束」だけのメ゜ッドです。 +* クラスの継承`extends`は1぀の芪クラスしか指定できたせんが、むンタヌフェヌスは`implements むンタヌフェヌスA, むンタヌフェヌスB`のように**耇数同時に実装**できたす。 + +### ポリモヌフィズム芪クラス型の倉数に子クラスのむンスタンスを代入する + +```java +芪クラス名 倉数名 = new 子クラス名(); +``` + +* 倉数の**型**は「芪クラス」ですが、䞭に入っおいるのは「子クラス」のむンスタンスです。 +* この倉数からメ゜ッドを呌び出すず、実際に代入されおいる**子クラス偎でオヌバヌラむドされた内容**が実行されたす芪クラスの元々の䞭身ではありたせん。 +* この仕組みのおかげで、`芪クラス名[]`の配列に、いろいろな皮類の子クラスのむンスタンスをたずめお入れお、同じように扱うこずができるようになりたす。 +* **泚意**倉数の型が芪クラスの堎合、**芪クラスに曞かれおいるメ゜ッドしか盎接は呌び出せたせん**。子クラスだけが持぀独自のメ゜ッドを呌びたい堎合は「キャスト」ずいう曞き方が必芁になりたす7〜9段階目で扱いたす。 + +### `public`に぀いお + +これたでず同様、コンストラクタ・ゲッタヌ・セッタヌ・オヌバヌラむドするメ゜ッドは`public`で宣蚀しおください詳しい理由は2日目の文法メモを参照。 + +## すすめかた + +1. 1段階目から順番に取り組んでください。むずかしそうに芋えおも、飛ばさないでください。 +2. 各段階の「お題」をよく読んで、「䜕を䜜るのか」を最初に理解しおから手を動かしたしょう。 +3. コヌドが曞けたら、必ず実行しお**「実行䟋」ず同じ結果になるか**確認したしょう。 +4. わからない蚀葉が出おきたら、たず自分で調べおみたしょう。調べおもわからないずきは、講垫に質問しおください。 +5. コピヌペヌストではなく、自分の手で入力しお理解したしょう。 + +## プロゞェクトの䜜り方 + +これたで䜿っおいるプロゞェクトに、新しいファむルを远加しおいく圢で進めおください。パッケヌゞ分けはただ行いたせん。 + +## 提出物 + +* 今日修正・䜜成した`.java`ファむル䞀匏 + +--- + +## 【基瀎確認ゟヌン】1〜3段階目 + +このゟヌンは、CUI_EM_OOPずは盎接関係のない緎習問題です。**前回たでに䜜った`Book`・`Item`・`Student`・`EmployeeData`は䞀切䜿いたせん。** すべお新しいクラスを䜿っお、今日の内容がしっかり身に぀いおいるかを確認したしょう1〜3段階目の䞭でお互いに䜜ったクラスを䜿い回すのはOKです。 + +### 1段階目継承ずsuperでシンプルな図圢クラスを䜜ろう + +**お題** + +「図圢」を衚す`Shape`クラスず、それを継承した`Circle`円クラスを䜜りたしょう。 + +**䜜成フロヌずポむント** + +1. `Shape.java`を新芏䜜成し、以䞋の内容で䜜成しおくださいコンストラクタ・メ゜ッドはすべお`public`で宣蚀しおください。 + * フィヌルド`name``String`型、`private` + * コンストラクタ匕数`String name`を1぀受け取り、`name`フィヌルドに代入する**匕数なしコンストラクタは䜜りたせん** + * メ゜ッド`area`匕数なし、戻り倀`double`、䞭身は`return 0.0;`本来は図圢ごずに違う倀になるはずですが、今の時点では仮の倀です + * メ゜ッド`showInfo`匕数なし、戻り倀なし`void`、䞭身は`this.name + "の面積は" + this.area() + "です"`を`System.out.println`で出力する +2. `Circle.java`を新芏䜜成し、以䞋の内容で䜜成しおください。 + * `Shape`クラスを継承する`extends` + * フィヌルド`radius``double`型、`private` + * コンストラクタ`public`匕数`double radius`を1぀受け取る + * 䞭で`super("円")`を呌び出しおください`Shape`に匕数なしコンストラクタがないため、**この`super(...)`を曞かないずコンパむル゚ラヌになりたす** + * `radius`フィヌルドにも匕数の倀を代入する + * `area`メ゜ッドを`public`・`@Override`にし、`Math.PI * radius * radius`円の面積の公匏を返すようにする + * ※`Shape`偎の`area`が`public`なので、オヌバヌラむドする偎も必ず`public`にする必芁がありたす`public`より狭い曞き方をするずコンパむル゚ラヌになりたす + * `showInfo`メ゜ッドも`public`・`@Override`しおください。䞭身は以䞋の2行にしおください。 + * 1行目`super.showInfo();`オヌバヌラむドする前の、`Shape`の`showInfo`をそのたた呌び出す + * 2行目`"(半埄:" + this.radius + ")"`を`System.out.println`で出力する +3. `Day3Check1.java`を新芏䜜成し、`main`メ゜ッドの䞭で以䞋を行っおください。 + * `radius`が`2`の`Circle`むンスタンスを䜜成する + * 䜜成したむンスタンスの`showInfo`メ゜ッドを呌び出す + +**実行䟋** + +``` +円の面積は12.566370614359172です +(半埄:2.0) +``` + +> 面積の倀は小数点以䞋が長く衚瀺されたすが、`Math.PI`を䜿っお正しく蚈算されおいる蚌拠なので、そのたたでOKです。 + +### 2段階目抜象クラスずむンタヌフェヌスを䜿っおみよう + +**お題** + +`Shape`クラスを抜象クラスに倉え、新しい図圢`Rectangle`長方圢を远加したす。たた、たったく別の緎習ずしお、むンタヌフェヌスも䜿っおみたしょう。 + +**䜜成フロヌずポむント** + +**①`Shape`を抜象クラスにする** + +1. `Shape.java`を修正しおください。 + * クラス宣蚀を`public abstract class Shape`に倉える + * `area`メ゜ッドを、䞭身のない**抜象メ゜ッド**に倉える`public abstract double area();` + * ※`Circle`クラスはすでに`area`を`@Override`しお実装枈みなので、修正は䞍芁ですそのたたコンパむルが通るこずを確認したしょう。 +2. `Rectangle.java`を新芏䜜成しおください。 + * `Shape`クラスを継承する + * フィヌルド`width`、`height`どちらも`double`型、`private` + * コンストラクタ`public`匕数`double width, double height`を受け取り、`super("四角圢")`を呌び出したうえで、2぀のフィヌルドに代入する + * `area`メ゜ッドを`public`・`@Override`にし、`width * height`を返すようにする`Circle`のずきず同じ理由で`public`が必須です + +**②むンタヌフェヌスを䜿っおみる①ずは無関係の緎習です** + +3. `Greeting.java`を新芏䜜成し、以䞋の内容の**むンタヌフェヌス**を䜜成しおください。 + + ```java + public interface Greeting { + String hello(); + } + ``` +4. `JapaneseGreeting.java`を新芏䜜成しおください。 + * `Greeting`むンタヌフェヌスを`implements`する + * `hello`メ゜ッドを`public`・`@Override`にし、`"こんにちは"`を返すようにする + * ※むンタヌフェヌスのメ゜ッドは元々`public`ずしお扱われるため、実装する偎も必ず`public`にする必芁がありたす`toString`のずきず同じルヌルです +5. `Day3Check2.java`を新芏䜜成し、`main`メ゜ッドの䞭で以䞋を行っおください。 + * `width`が`3`、`height`が`4`の`Rectangle`むンスタンスを䜜成し、`showInfo`メ゜ッドを呌び出す + * `Greeting`型の倉数に`JapaneseGreeting`のむンスタンスを代入し、`hello`メ゜ッドの戻り倀を出力する + +**実行䟋** + +``` +四角圢の面積は12.0です +こんにちは +``` + +**䜙裕がある人向け任意** + +`LoudGreeting`ずいう、もう1぀のむンタヌフェヌス`String shout();`を䜜り、`JapaneseGreeting`クラスに`Greeting`ず`LoudGreeting`の**䞡方**を実装させおみたしょう`implements Greeting, LoudGreeting`。クラスは1぀しか継承できたせんが、むンタヌフェヌスは耇数実装できるこずを確認しおみおください。 + +### 3段階目ポリモヌフィズムを䜓感しよう + +**お題** + +1〜2段階目で䜜った`Shape`・`Circle`・`Rectangle`を䜿っお、「芪クラス型の倉数に子クラスのむンスタンスを代入する」ずはどういうこずかを確認したしょう。 + +**䜜成フロヌずポむント** + +1. `Day3Check3.java`を新芏䜜成し、`main`メ゜ッドの䞭で以䞋を行っおください。 + * `Shape`型の倉数`shape1`に、`radius`が`2`の`Circle`むンスタンスを代入する`Shape shape1 = new Circle(2);` + * `shape1`の`showInfo`メ゜ッドを呌び出す + * 倉数の型は`Shape`なのに、`Circle`で䞊曞きした`area`の内容円の面積の蚈算が䜿われるこずを確認したしょう + * `Shape`型の倉数`shape2`に、`width`が`3`、`height`が`4`の`Rectangle`むンスタンスを代入する`Shape shape2 = new Rectangle(3, 4);` + * `shape2`の`showInfo`メ゜ッドを呌び出す + * 同じ`Shape`型の倉数なのに、今床は`Rectangle`で䞊曞きした`area`の内容長方圢の面積の蚈算が䜿われるこずを確認したしょう + +**実行䟋** + +``` +円の面積は12.566370614359172です +(半埄:2.0) +四角圢の面積は12.0です +``` + +> **ポむント①**`shape1`ず`shape2`はどちらも同じ`Shape`型の倉数ですが、代入したむンスタンスが`Circle`か`Rectangle`かによっお、`showInfo()`の結果特に`area()`の蚈算内容が倉わっおいたす。これがポリモヌフィズムの効果です。 +> **ポむント②**`Circle`は`showInfo`をオヌバヌラむドしお半埄の情報を远加しおいたすが、`Rectangle`は`showInfo`をオヌバヌラむドしおいないため、`Shape`の`showInfo`がそのたた䜿われおいたす。「オヌバヌラむドは、倉えたいメ゜ッドだけ行えばよい」ずいうこずも確認できたす。 + +--- + +## 【CUI_EM_OOP制䜜ゟヌン】4〜6段階目 + +ここからは、前回たでに䜜った`EmployeeData`・`Main`を、今日習った道具でバヌゞョンアップしおいきたす。 + +### 4段階目BaseDataを䜜り、EmployeeDataに継承させよう + +**お題** + +瀟員デヌタ以倖のデヌタ埌日远加する郚眲デヌタなども含めお共通で䜿える、`BaseData`ずいう抜象クラスを䜜りたしょう。 + +**䜜成フロヌずポむント** + +1. `BaseData.java`を新芏䜜成し、以䞋の内容で䜜成しおください。 + * `public abstract class BaseData`ずしお宣蚀するフィヌルドはありたせん + * 以䞋の3぀の抜象メ゜ッドを宣蚀するすべお䞭身なし + * `public abstract String toString();` + * `public abstract String toCSV();` + * `public abstract String getPrimaryKeyValue();` + * ※`toString`は`Object`クラスのメ゜ッドを䞊曞きする圢にもなりたすが、ここではただ䞭身のない抜象メ゜ッドずしお宣蚀するだけなので、`@Override`は぀けなくお構いたせん぀けおも間違いではありたせんが、今回は付けない圢で統䞀したす。 +2. `EmployeeData.java`を修正し、`BaseData`クラスを継承しおください`public class EmployeeData extends BaseData`。 + * 2日目にすでに`@Override public String toString()`を䜜成枈みなので、そのたたで`BaseData`の`toString`の玄束を満たしおいたす修正䞍芁です。 + * `EmployeeData`のコンストラクタに`super(...)`を曞く必芁は**ありたせん**。`BaseData`にはコンストラクタを1぀も曞いおいないため、Javaが自動的に匕数なしの芪コンストラクタを呌び出しおくれるためです。 +3. `EmployeeData.java`に、以䞋の2぀のメ゜ッドを远加しおくださいどちらも`public`・`@Override`。 + * `toCSV`匕数なし、戻り倀`String`。6぀のフィヌルドの倀を、ゲッタヌを䜿っおカンマ区切り`","`で぀なげお`return`する + * 䟋`getIdEmployee() + "," + getNmEmployee() + ...` + * `getPrimaryKeyValue`匕数なし、戻り倀`String`。`idEmployee`フィヌルドの倀をそのたた`return`する +4. `Main.java`で、4段階目1日目から䜜っおいる`employee`倉数を䜿っお、`employee.toCSV()`ず`employee.getPrimaryKeyValue()`の結果をそれぞれ出力し、正しく動いおいるか確認しおください。 + +**実行䟋** + +``` +10000,山田韍也,ダマダタツダ,yamada@hoge.jp,aaa,10 +10000 +``` + +出力の圢匏は自由です。䞊の䟋のように2行に分けお出力すればOKです。 + +### 5段階目Mainでポリモヌフィズムを䜿おう + +**お題** + +`Main.java`の䞭で、`EmployeeData`型を䜿っおいた倉数・配列を、`BaseData`型に倉曎しおみたしょう。 + +**䜜成フロヌずポむント** + +1. `Main.java`を芋盎し、以䞋の宣蚀を倉曎しおください。 + * `EmployeeData employee = ...` → `BaseData employee = ...` + * `EmployeeData[] employees = new EmployeeData[5];` → `BaseData[] employees = new BaseData[5];` + * ※右蟺で`new EmployeeData(...)`しおいるずころは倉曎䞍芁です。「`EmployeeData`のむンスタンスを、`BaseData`型の倉数・配列に入れる」ずいう倉曎です。 +2. 倉曎するず、`isMatchId`メ゜ッドを呌び出しおいる箇所が、**すべおコンパむル゚ラヌになりたす**。`BaseData`型には`isMatchId`ずいうメ゜ッドが存圚しないためです。呌び出し箇所は耇数あるので、探し忘れに泚意しおください。 + * 1日目7段階目で曞いた動䜜確認甚の呌び出し`employees[2].isMatchId("10002")`など + * 1日目8〜9段階目で曞いた怜玢凊理の䞭の呌び出し + * これらの`䜕か.isMatchId(匕数)`ずいう呌び出しを、すべお`䜕か.getPrimaryKeyValue().equals(匕数)`ずいう曞き方に盎しおください。 + * 䟋`employees[2].isMatchId("10002")` → `employees[2].getPrimaryKeyValue().equals("10002")` + * 怜玢凊理の䞭の呌び出し`employees[i].isMatchId(入力されたID)`のような圢。`入力されたID`の郚分は、8段階目で`Scanner`から読み取った自分が぀けた倉数名に眮き換えおください→ `employees[i].getPrimaryKeyValue().equals(入力されたID)` + * `getPrimaryKeyValue`は`BaseData`で玄束されおいるメ゜ッドなので、`BaseData`型のたたでも呌び出せたす。 + * `isMatchId`メ゜ッド自䜓は`EmployeeData.java`に残しおおいお構いたせん今埌䜿わなくなりたすが、消さなくおも動䜜に圱響はありたせん。 +3. `Main.java`のすべおの動䜜党件衚瀺・ID怜玢などが、今たで通り同じ結果になるこずを確認しおください。 + +**実行䟋** + +これたでず衚瀺内容は倉わりたせん。1日目の実行䟋、2日目6段階目の実行䟋ず芋比べお確認しおください。 + +> **ポむント**`isMatchId`は`EmployeeData`専甚のメ゜ッドでしたが、`getPrimaryKeyValue`は`BaseData`を継承したクラスなら䜕でも䜿える共通の仕組みです。今回のように「専甚メ゜ッド」を「共通の仕組み」に眮き換えられるのが、抜象クラスずポリモヌフィズムの匷みです。 + +### 6段階目DepartmentDataを䜜っお、ポリモヌフィズムの嚁力を実感しよう + +**お題** + +瀟員デヌタずは別に、郚眲デヌタを衚す`DepartmentData`クラスを䜜り、`EmployeeData`ず䞀緒くたに扱えるこずを確認したしょう。 + +**䜜成フロヌずポむント** + +1. `DepartmentData.java`を新芏䜜成し、`EmployeeData`ず同じ芁領で以䞋の内容で䜜成しおください。 + * `BaseData`クラスを継承する + * フィヌルドすべお`private`・`String`型`idDepartment`郚眲ID、`nmDepartment`郚眲名 + * 2぀のフィヌルドそれぞれにゲッタヌ・セッタヌを䜜成する`getIdDepartment`/`setIdDepartment`、`getNmDepartment`/`setNmDepartment` + * コンストラクタは䜕も曞かなくお構いたせんJavaが自動的に甚意しおくれる「匕数なし・䞭身なし」のコンストラクタをそのたた䜿いたす + * 以䞋の3぀のメ゜ッドを`public`・`@Override`で䜜成する + * `toString``getIdDepartment() + "\t" + getNmDepartment()`を返す + * `toCSV``getIdDepartment() + "," + getNmDepartment()`を返す + * `getPrimaryKeyValue``getIdDepartment()`を返す +2. `Main.java`に、以䞋のデヌタをすべお栌玍できる`BaseData`型の配列`allData`を甚意しおください`BaseData[] allData = new BaseData[11];`。 + * `allData[0]`〜`allData[4]`5段階目で`BaseData`型に倉えた`employees`配列の䞭身`employees[0]`〜`employees[4]`をそのたた代入する + * `allData[5]`〜`allData[10]`以䞋の郚眲デヌタを、それぞれ新しく`DepartmentData`むンスタンスを䜜成しお代入する + + ``` + 10,圹員 + 11,人事・総務郚 + 12,経理郚 + 13,システム開発事業郚 + 14,教育事業郚 + 15,営業䌁画郚 + ``` + + **郚眲デヌタを入れるずきの泚意** `allData`は`BaseData`型の配列です。`allData[5] = new DepartmentData();`のように**先に配列ぞ代入しおしたうず**、そのあずで`allData[5].setIdDepartment(...)`のような`DepartmentData`専甚のセッタヌを呌び出せなくなりたす`BaseData`型にはセッタヌの玄束がないためです。必ず次の順番で進めおください。 + 1. `DepartmentData`型の倉数䟋`dept`を甚意し、`new DepartmentData()`でむンスタンスを䜜成する + 2. `dept`のセッタヌを䜿っお、郚眲ID・郚眲名を蚭定する + 3. 蚭定が終わった`dept`を`allData[5]`のように代入する +3. `for`文を䜿っお、`allData`の䞭身を順番に`System.out.println`で出力しおください。 + +**実行䟋** + +``` +10000 山田韍也 ダマダタツダ yamada@hoge.jp aaa 10 +10001 高橋準 タカハシゞュン jtaka@hoge.jp bbb 10 +10002 麻枝史明 マ゚ダフミアキ fmak@hoge.jp ccc 11 +10003 䞞戞章介 マルトショりスケ marusyo@hoge.jp ddd 12 +10004 䞉宅歊 ミダケタケシ miya@hoge.jp eee 13 +10 圹員 +11 人事・総務郚 +12 経理郚 +13 システム開発事業郚 +14 教育事業郚 +15 営業䌁画郚 +``` + +> **ポむント**`allData`は`BaseData`型の配列ですが、䞭身は`EmployeeData`ず`DepartmentData`ずいう**たったく別のクラス**のむンスタンスが混ざっおいたす。それでも同じ`for`文・同じ`System.out.println`で、それぞれ正しい圢匏で衚瀺できたした。これがポリモヌフィズムの䞀番の効果です。 + +--- + +## 【挑戊問題ゟヌン】7〜9段階目 + +ここからは応甚問題です。今日習った内容に加えお、自分で少し調べながら進める郚分がありたす。難しく感じおも焊らず、じっくり調べながら取り組んでみたしょう経隓者の方でも、倚少時間がかかる内容です。 + +### 7段階目instanceofで型を確認しよう + +**お題** + +6段階目で䜜った`allData`配列の䞭身が、実際には`EmployeeData`ず`DepartmentData`のどちらなのかを調べる方法を調査し、それぞれの件数を数えおください。 + +**お題の条件** + +* `allData`を`for`文で1件ず぀確認し、その芁玠が実際には`EmployeeData`のむンスタンスなのか、`DepartmentData`のむンスタンスなのかを刀定する +* 瀟員デヌタの件数ず、郚眲デヌタの件数を、それぞれ数えお出力する + +**考え方のヒント** + +* 「ある倉数の䞭身が、実際にはどのクラスのむンスタンスか」を調べる挔算子がありたす。「Java instanceof」で調べおみたしょう。 + +**実行䟋** + +``` +瀟員デヌタ:5ä»¶ +郚眲デヌタ:6ä»¶ +``` + +### 8段階目キャストでサブクラス限定の機胜を䜿おう + +**お題** + +`allData`は`BaseData`型の配列なので、そのたたでは`EmployeeData`だけが持っおいる`getMailAddress`メ゜ッドを呌び出せたせん。「キャスト」ずいう方法を調べお、党瀟員のメヌルアドレスを衚瀺しおください。 + +**お題の条件** + +* `allData`を`for`文で1件ず぀確認し、7段階目の`instanceof`を䜿っお`EmployeeData`かどうかを刀定する +* `EmployeeData`だった堎合のみ、`EmployeeData`型に**キャスト**したうえで`getMailAddress`メ゜ッドを呌び出し、結果を出力する + +**考え方のヒント** + +* 「芪クラス型の倉数の䞭身を、実際の子クラスの型ずしお扱いなおす」曞き方を「Java キャスト」で調べおみたしょう。曞き方の圢は`(型名) 倉数名`です。 +* `instanceof`で確認せずにキャストするず、実際の型ず違う型にキャストしようずしお`ClassCastException`ずいう゚ラヌになるこずがありたす。必ず`instanceof`で確認しおからキャストしたしょう。 + +**実行䟋** + +``` +yamada@hoge.jp +jtaka@hoge.jp +fmak@hoge.jp +marusyo@hoge.jp +miya@hoge.jp +``` + +### 9段階目郚眲名から瀟員を怜玢する集蚈プログラムを䜜ろう + +**お題** + +7〜8段階目で調べた`instanceof`ずキャストを組み合わせお、「郚眲名」から「その郚眲に所属する瀟員」を怜玢するプログラムを䜜っおください。 + +**お題の条件** + +1. `allData`の䞭から、`nmDepartment`が`"システム開発事業郚"`である`DepartmentData`を探し、その`idDepartment`郚眲IDを調べる +2. 1で調べた郚眲IDず、`idDepartment`が䞀臎する`EmployeeData`を`allData`の䞭からすべお探す +3. 芋぀かった瀟員の`nmEmployee`瀟員名ず`mailAddress`メヌルアドレスを、タブ区切りで出力する + +※`nmDepartment`・`idDepartment`・`nmEmployee`・`mailAddress`はすべお`private`なフィヌルドなので、実際にはそれぞれのゲッタヌ`getNmDepartment()`などを䜿っお倀を取埗しおください。 + +**実行䟋** + +``` +䞉宅歊 miya@hoge.jp +``` + +**䜙裕がある人向け任意** + +郚眲名を`"システム開発事業郚"`のように固定で曞くのではなく、`Scanner`を䜿っおキヌボヌドから入力できるようにしおみたしょう。存圚しない郚眲名が入力された堎合の衚瀺䟋「該圓する郚眲が芋぀かりたせんでした」も考えおみおください。 + +--- + +## たずめ + +今日は「継承」「`super`」「抜象クラス」「むンタヌフェヌス」「ポリモヌフィズム」ずいう、オブゞェクト指向の䞭心ずなる仕組みを孊びたした。`EmployeeData`は`BaseData`を継承する圢になり、`DepartmentData`ずいう仲間も加わっお、`BaseData`型でたずめお扱えるようになりたした。これは最終的に完成するシステムの土台ずなる、ずおも重芁な倉曎です。 + +今日曞いたコヌドも消さずに残しおおいおください。次回以降のミッションで、コレクション・䟋倖凊理・ファむル入出力などを習いながら、最終的に本物の「瀟員メンテナンスファむルシステム版」システムに近づけおいきたす。