突っ走り書き

見せるほどのものでは..

もう「親クラス」「子クラス」と呼ぶのは終わりにしよう

オブジェクト指向プログラミングでは,継承によって関連をもつクラスを次のように呼びます.

  • スーパー/サブクラス
  • 基底/派生クラス
  • 親/子クラス

このエントリでは,

  • 「親クラス」「子クラス」という呼び名は不適切なのでは?

という意見とその理由についてまとめます.

継承は「親子」関係とチト違う

例として,Language クラスと Japanese クラスを使います.
Japanese クラスは Language クラスを継承しています.

// file name: Language.java

public class Language {

}
// file name: Japanese.java

public class Japanese extends Language {

}

このとき,継承関係を宣言したのは親クラスと子クラスのどちらでしょうか?
『Japanese extends Language』 と Japanese.java に書いてあるので,継承の宣言をしたのは子クラス(Japanese)です.

ここが現実世界と違います.
子クラスは親クラスの宣言によって生まれるのではなく,子クラス自身が親を宣言したときに,子クラスになるのです.
親の望みに関わらず,子供が選んだ人が親になれるということです.

この考え方は,UMLにも反映されています.
継承関係にある2つのクラスをUMLで書くとき,矢印は「子クラス」から「親クラス」に向かいます.
子供が親を指差したとき,継承関係が生まれるイメージです.

このように,オブジェクト指向言語の「継承関係」は現実世界の「親子関係」とは異なります.
よって,『子クラス』『親クラス』という呼び名は不適切です.

多態性

子クラスが親クラスとの継承関係を宣言するという言語仕様が,オブジェクト指向の重要な考え方である『多態性』へとつながっています.
もし,親クラスが継承を宣言するならば,次のようになるはずです.

public class Language extendedBy Japanese, English {

}

このとき,Language クラスは Japanese/English クラスを知っていなければいけません.
多態性とは,型を隠蔽するための手法です.
抽象的なクラスであるはずの Language クラスが具体的な存在である Japanese/English を知らなければいけないというのは,オブジェクト指向的ではありません.

まとめ

継承について言語仕様やUMLにあてはめて考えると,子/親クラスという呼び方は不適切です.
賛同される方は,ぜひ「子/親クラス」の撲滅にご協力を.