オブジェクト指向②継承とインターフェイス

https://gyazo.com/ac56caad0b3dd031d0f2e470a58e4ba1

プロジェクトの準備

Eclipseで新規にプロジェクトを作成しましょう. メニューから[ファイル]-[新規]-[Javaプロジェクト]をクリックして,「新規Javaプロジェクトの作成」を開きます. ここでは,プロジェクト名に”Project8”を入力して,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したプロジェクトが表示されていることを確認してください.

https://gyazo.com/aed71e52d207f93bcc80b18f00f54710

続いてソースファイルを作成しましょう. メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”MyClass”を入力し,public static void main(String[] args)(V)にチェックを入れ,[完了]をクリックしましょう. パッケージ・エクスプローラに作成したソースファイルが表示されていることを確認してください.

https://gyazo.com/6997418967567ab61292b06ecf566aa4

継承とは

前回はオブジェクト指向について学習しました. オブジェクト指向とは「現実世界のオブジェクト(もの)を,そのままプログラムの世界のオブジェクト(もの)に置き換えること」を意味しているんでしたね. そして,オブジェクトの型をクラスで表現することも理解したかと思います. 今回は,オブジェクト指向における重要な機能の1つクラスの継承について学びます. クラスの継承とは,「クラスの持つフィールドやメソッドを引き継ぎながら新しいクラスを作成すること」を意味しています. この継承という機能を利用することで,コードの冗長性を排除し,スッキリとした表現で記述することが可能になります.

ここでは,会話が出来るロボットを表すRobotクラスを作成してみましょう. メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”Robot”を入力し,[完了]をクリックしましょう.

https://gyazo.com/38cfeab5c7516c7921da141b572f75a0

下記のコードを参考に,nameフィールドと,speakメソッドを定義してください. コンストラクタでnameフィールドを初期化していることに注意してください.

下記のコード参考にRobotクラスをインスタンス化してみましょう. ここでは,ロボットの名前をロボット1号とします. プログラムの実行後にコンソール出力を確認してください.

上記で作成したロボット1号は一方的に話すだけで面白くありません. そこで,次に対話が可能なロボットに改良してみましょう. このようなときに利用すると便利な機能が継承です. Robotクラスを継承してTalkRobotを作成してみます.

メニューから[ファイル]-[新規]-[クラス]をクリックして,「新規Javaクラス」を開きます. ここでは,名前に”TalkRobot”,スーパクラスに"Robot"を入力し,[完了]をクリックしましょう. このスーパークラスとは,継承元となるクラスを意味し,「スーパークラス」の他にも「親クラス」などと呼びます. 一方,継承したクラスは,「サブクラス」や「子クラス」と呼びます.

https://gyazo.com/9b0ac23357e6cc4450ead3aa936ad38f

継承するとクラス宣言部のextendsの後に継承元のクラス名が記述されます. 下記のコードを参考に,talkメソッドを定義してください. talkメソッドでは,キーボードから名前を入力すると,ロボットが入力された名前を話します. コンストラクタ内のsuper(name)は,スーパークラスであるRobotクラスのコンストラクタと同じ処理をします.

下記のコードを参考にTalkRobotクラスをインスタンス化してみましょう. ここでは,ロボットの名前をロボット2号とします. プログラムの実行後にコンソール出力を確認してください. Robotクラスを継承することで,Robotクラスのnameフィールドやspeakメソッドを, TalkRobotでも利用できることが分かります.

TalkRobotクラスで,speakメソッドを修正することもできます. これをオーバーライドと呼びます. ここでは,下記のコードを参考にspeakメソッドをオーバライドして, 男らしい話し方をするロボットに修正しましょう. プログラムの実行後にコンソール出力を確認してください.

インターフェイスとは

継承する際にスーパークラスは1つしか指定することはできません. 複数の継承元の機能を引き継ぎたい場合はどうすれば良いでしょうか(多重継承と呼びます). このような場合に利用するのがインターフェイスです. インターフェイスは下記の点がクラスとは異なります.

ここで,抽象メソッドとは「メソッド名はあるけど内容は未定義」という特徴を持ちます. このため,インターフェイスで定義されているメソッドは,継承したクラスで必ずオーバーライドする必要があります. また,インターフェイスを継承することを実装と呼ぶことが多いので注意が必要です.

ここでは,ロボットに飛行機能を付与するFlightUnitインターフェィスを作成してみましょう. メニューから[ファイル]-[新規]-[インターフェイス]をクリックして,「新規Javaインターフェイス」を開きます. ここでは,名前に”FlightUnit”を入力し,[完了]をクリックしましょう.

https://gyazo.com/562b2b2e94838602ab863cbcefede76a

下記のコードを参考に,flyメソッドを定義してください. このflyメソッドは抽象メソッドのためpublic void fly();と記述します.

下記のコードを参考にTalkRobotクラスにFlightUnitインターフェイスを実装してみましょう. インターフェイスを実装するにはクラス宣言部のimplementsの後にインターフェイス名を記述します. また,flyメソッドもオーバーライドしておきます.

最後に,下記のコードを参考に,TalkRobotのインスタンスからflyメソッドを呼び出してみましょう. プログラムの実行後にコンソール出力を確認してください.

課題

ロボットに歌唱機能を付与するSingUnitインターフェイスを作成してください. メソッド名はsingとし,TalkRobotに実装したうえで,singメソッドを呼び出してください. 課題が完成したら,作成したプロジェクトを実行可能JARファイルの形式でファイルに保存(エクスポート)してください.

参考書籍