INTRODUCTION
「extendsとimplementsって何が違うの?」
Javaを勉強していると、 こんなコードを見ることがあります。
class Employee extends Person {
}
さらに別の場所では、
class Employee implements Printable {
}
どちらも 「別のものと関係している」 ように見えます。
でも、役割は同じではありません。
extendsは「親子関係」
implementsは「このルールに従う」
まずは、このくらいのイメージから 入ると分かりやすくなります。
01
まずは普通のクラス
例えば、 社員を表すクラスがあるとします。
class Employee {
String name;
void work() {
System.out.println("仕事をする");
}
}
このクラスを使えば、 社員の情報や処理を まとめて扱うことができます。
ところがシステムが大きくなると、 似たようなクラスが増えてきます。
class Manager {
String name;
void work() {
System.out.println("仕事をする");
}
void manage() {
System.out.println("管理する");
}
}
「社員」と「管理職」で 共通している部分があります。
こういうときに出てくるのが 継承です。
02
extendsは「共通部分を引き継ぐ」
例えば、
Employee を
親クラスにします。
class Employee {
String name;
void work() {
System.out.println("仕事をする");
}
}
そして、
Manager が
Employee を継承します。
class Manager extends Employee {
void manage() {
System.out.println("管理する");
}
}
すると、
Manager は
Employee の
共通部分を利用できます。
「ManagerだからEmployeeとしての 基本的な部分も持っている」 と考えると分かりやすいです。
03
継承すると何がうれしいのか
継承の分かりやすいメリットの一つは、 共通処理をまとめられることです。
例えば、
class Employee {
String name;
void work() {
System.out.println("仕事をする");
}
}
という共通部分を作っておけば、
class Manager extends Employee {
}
class Developer extends Employee {
}
ManagerとDeveloperの両方で、 Employeeの共通部分を 利用できます。
実際の業務システムでも、
「このクラスとこのクラス、
かなり似ているな」
という場面があります。
そういうときに、 共通部分をどう整理するかが 重要になります。
04
でも、何でも継承すればいいわけではない
ここが実際の開発で 少し難しいところでした。
クラスが似ているからといって、 何でも継承すればいいわけではありません。
例えば、
「AはBの一種なのか?」
という視点で考えると 少し整理しやすくなります。
例えば、
Manager extends Employee
なら、
「ManagerはEmployeeの一種」
と考えられます。
こうした関係が自然なら 継承を検討できます。
「コードを共通化したいから継承する」
だけではなく、
「本当に親子関係なのか?」
を考えることが大切です。
05
そこで出てくるインターフェース
継承とは別に、 Javaには インターフェース があります。
例えば、
interface Printable {
void print();
}
これは、
「printという処理を持ってください」
というルールを 定義しているようなものです。
06
implementsは「このルールを使います」
クラスがインターフェースを
使う場合は、
implements
を使います。
class Report implements Printable {
public void print() {
System.out.println("帳票を印刷する");
}
}
ここでは、
という関係になっています。
「ReportはPrintableの一種」 というより、
「ReportはPrintableという ルールに対応できる」
と考えると理解しやすくなります。
07
extendsとimplementsを並べてみる
ここまでを並べると、 違いが見えてきます。
class Manager extends Employee {
}
これは、
Employeeを引き継ぐ
という関係です。
class Report implements Printable {
}
こちらは、
Printableというルールに対応する
という関係です。
extends
→ 「親から引き継ぐ」
implements
→ 「決められたものを実装する」
08
業務コードではどう見えるのか
実際の業務コードでは、 もっと複雑なクラス構成に なっていることがあります。
例えば、
class CsvReport
extends Report
implements Exportable {
}
のようなコードです。
最初に見ると、
「extendsとimplementsが 両方ある……」
となりがちです。
でも、分解すると、
という2つの関係が 同時に書かれているだけです。
複雑に見えるコードほど、
「このクラスは何を引き継いでいるのか」
「どんなルールに対応しているのか」
と分けて見ると読みやすくなります。
FIELD NOTE
クラス同士の関係を見る
Javaのコードを読んでいて
extends や
implements が出てくると、
最初は難しく感じます。
でも、
「このクラスは、
何を引き継いでいるのか?」
「どんなルールに対応しているのか?」
という2つの視点で見ると、 少しずつ構造が見えてきます。
実際の開発では、 一つのクラスだけを見るのではなく、 そのクラスがどのクラスや インターフェースとつながっているのかを 見ることが大切でした。
SUMMARY
今回のポイント
継承は、 クラスの共通部分を 引き継ぐための仕組みです。
extends は、
「このクラスを引き継ぐ」
という関係。
implements は、
「このインターフェースの
ルールを実装する」
という関係です。
最初から細かい仕様を 全部覚える必要はありません。
まずは、
extends
→ クラスを引き継ぐ
implements
→ インターフェースを実装する
この2つの違いが分かれば、 業務コードを読むときにも クラス同士の関係を 少し追いやすくなります。