インヘリタンス(インヘリタンス)とは | 意味や読み方など丁寧でわかりやすい用語解説
インヘリタンス(インヘリタンス)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
継承 (ケイショウ)
英語表記
inheritance (インヘリタンス)
用語解説
インヘリタンスは、オブジェクト指向プログラミングにおける中心的な概念の一つであり、日本語では「継承」と訳される。これは、既存のクラスが持つ性質(データや振る舞い)を引き継いで、新しいクラスを作成するための仕組みである。この仕組みを利用することで、コードの再利用性を高め、プログラムの構造を整理し、保守や拡張を容易にすることが可能となる。インヘリタンスの関係において、性質を譲り渡す元のクラスをスーパークラス(親クラスや基底クラスとも呼ぶ)といい、性質を受け継いで新しく作られるクラスをサブクラス(子クラスや派生クラスとも呼ぶ)という。サブクラスは、スーパークラスからフィールド(データや属性)とメソッド(操作や振る舞い)をそのまま引き継ぐ。これにより、共通する機能をスーパークラスにまとめて定義しておけば、複数のサブクラスで同じコードを繰り返し記述する必要がなくなる。さらに、サブクラスはスーパークラスから引き継いだ機能に加えて、独自のフィールドやメソッドを追加したり、引き継いだメソッドの振る舞いを自身の要件に合わせて変更したりすることができる。この性質が、プログラムの拡張性を高める上で重要な役割を果たす。
インヘリタンスを適用する上で基本となる考え方は、「is-a関係」である。これは、サブクラスがスーパークラスの一種である、という関係が成り立つ場合に継承を用いるべきだという設計指針を示す。例えば、「犬」クラスと「動物」クラスを考える場合、「犬は動物の一種である(Dog is an animal)」という関係が成立するため、「動物」をスーパークラス、「犬」をサブクラスとして継承関係を構築するのは適切である。このように、より汎用的で抽象的な概念をスーパークラスとし、より具体的で専門的な概念をサブクラスとすることで、論理的で分かりやすいクラス階層を設計できる。
サブクラスはスーパークラスのメンバを引き継ぐが、すべてのメンバが利用可能になるわけではない。アクセス修飾子によって、サブクラスからのアクセス可否が制御される。例えば、publicやprotectedとして宣言されたメンバはサブクラスから直接アクセスできるが、privateとして宣言されたメンバはスーパークラスの内部からしかアクセスできず、サブクラスから直接参照したり変更したりすることはできない。これは、スーパークラスの実装詳細を隠蔽し、意図しない変更から保護するための重要な仕組みである。
サブクラスは、スーパークラスから継承したメソッドの具体的な処理内容を、自身のクラスに合わせて再定義することができる。この機能を「オーバーライド」と呼ぶ。例えば、「動物」スーパークラスに「鳴く」というメソッドが定義されていたとしても、その鳴き方は動物の種類によって異なる。そこで、「犬」サブクラスでは「鳴く」メソッドを「ワンと鳴く」処理にオーバーライドし、「猫」サブクラスでは「ニャーと鳴く」処理にオーバーライドする。これにより、同じ「鳴く」というメソッド呼び出しでも、実際のインスタンスが犬か猫かによって実行される処理が変化する。これは、オブジェクト指向のもう一つの重要な概念であるポリモーフィズム(多態性)を実現するための基礎となる。
インスタンス生成時に実行されるコンストラクタの扱いにも特徴がある。サブクラスのインスタンスが生成される際には、まずスーパークラスのコンストラクタが呼び出され、その処理が完了した後にサブクラスのコンストラクタが実行されるという順序になる。これにより、サブクラスの初期化に必要なスーパークラス側の状態が、確実に準備されることが保証される。
プログラミング言語によって、継承の形態には違いがある。多くの言語(JavaやC#など)は、一つのサブクラスが直接継承できるスーパークラスは一つだけという「単一継承」のモデルを採用している。これは、複数のスーパークラスから同名のメソッドを継承した場合にどちらを優先すべきかという曖昧さが生じる「ダイヤモンド問題」などの複雑さを避けるためである。一方で、C++などの言語では、複数のスーパークラスから性質を引き継ぐ「多重継承」をサポートしている。
インヘリタンスは強力な機能であるが、適切に使用しなければプログラムの複雑性を増大させる要因ともなる。スーパークラスとサブクラスは密接に結びつくため、スーパークラスの仕様変更がすべてのサブクラスに予期せぬ影響を与える可能性がある。また、継承の階層が深くなりすぎると、クラス間の関係を把握することが困難になり、保守性を低下させる。したがって、単にコードを再利用したいという目的だけで安易に継承を用いるのではなく、「is-a関係」が明確に成立するかを慎重に検討し、場合によっては継承以外の設計手法(コンポジションなど)を選択することが重要である。