オブジェクト指向プログラミングでは,継承によって関連をもつクラスを次のように呼びます.
- スーパー/サブクラス
- 基底/派生クラス
- 親/子クラス
このエントリでは,
- 「親クラス」「子クラス」という呼び名は不適切なのでは?
という意見とその理由についてまとめます.
継承は「親子」関係とチト違う
例として,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にあてはめて考えると,子/親クラスという呼び方は不適切です.
賛同される方は,ぜひ「子/親クラス」の撲滅にご協力を.