継承(プログラミング)
継承とは
継承(英:inheritance)とは、オブジェクト指向を構成する概念の一つです。(※オブジェクト指向の3大要素は"継承"、"ポリモーフィズム(多態性)"、"カプセル化")
クラスが持っている機能(変数やメソッド)を他のクラスに引き継がせることを継承といい、継承元のクラスを親クラス(スーパークラス)、継承先のクラスを子クラス(サブクラス)と呼びます。
以下は継承のイメージ例です。

継承は親クラスの機能を子クラスに引き継がせるので、子クラスは親クラスの機能が使えるようになります。
スポンサーリンク
継承のメリット
それでは、継承のメリットをオブジェクト指向言語である「Java」を使い説明していきます。
例えば、次のような「新車クラス」と「中古クラス」があるとします。この2つのクラスは継承を利用していません。
[新車クラス]
public class NewCar {
/**
* 製造元
*/
private static final String MANUFACTURER = "○○自動車";
/**
* 製造元と販売価格を出力する
* @param price 販売価格
*/
private void print(int price) {
System.out.println("製造元は" + MANUFACTURER);
System.out.println("販売価格は" + price + "円");
}
/**
* 新車の製造元と販売価格を出力する
* @param price 販売価格
*/
public void printNewCar(int price) {
System.out.println("新車です");
print(price);
}
}
[中古クラス]
public class OldCar {
/**
* 製造元
*/
private static final String MANUFACTURER = "○○自動車";
/**
* 製造元と販売価格を出力する
* @param price 販売価格
*/
private void print(int price) {
System.out.println("製造元は" + MANUFACTURER);
System.out.println("販売価格は" + price + "円");
}
/**
* 中古車の製造元と販売価格を出力する
* @param price 販売価格
*/
public void printOldCar(int price) {
System.out.println("中古車です");
print(price);
}
}
「新車クラス」と「中古クラス」はどちらも車に関連するクラスであり、以下の内容がまったく同じです。


このように同じ内容のソースコードを色々な個所に書くと、修正する際に複数の個所を直す必要があり(また修正漏れが発生する可能性もある)保守性が悪くなります。
そのため、共通的な部品は「共通クラス」として管理するか「継承」して管理します。(例えば、色々なクラスで使う共通的な部品であれば共通クラス、車クラスの共通部品であれば車の親クラスで管理など)
スポンサーリンク
そこで、継承を利用します。
[車の基本クラス]
public class BaseCar {
/**
* 製造元
*/
private static final String MANUFACTURER = "○○自動車";
/**
* 製造元と販売価格を出力する
* @param price 販売価格
*/
protected void print(int price) {
System.out.println("製造元は" + MANUFACTURER);
System.out.println("販売価格は" + price + "円");
}
}
[基本クラスを継承した新車クラス]
public class NewCar extends BaseCar {
/**
* 新車の製造元と販売価格を出力する
* @param price 販売価格
*/
public void printNewCar(int price) {
System.out.println("新車です");
print(price);
}
}
[基本クラスを継承した中古クラス]
public class OldCar extends BaseCar {
/**
* 中古車の製造元と販売価格を出力する
* @param price 販売価格
*/
public void printOldCar(int price) {
System.out.println("中古車です");
print(price);
}
}
上記のように継承を使うことで、車の共通的な機能は親クラスで管理し、子クラスでは、子クラス独自の機能を実装するだけです。
継承を利用することで、何度も同じソースコードを書かずに済み、読みやすいソースコードが書けます。
