is-a 関係とは
オブジェクト指向プログラミング、
知識表現、オブジェクト指向設計において、
is-a 関係とは、あるクラス(サブクラス)が別のクラス(スーパークラス)の特殊型であることを示す関係です。これは、クラス間の親子関係を表現するもので、「B is a A」という場合、クラスBはクラスAの
派生型であり、AはBの汎化された概念であることを意味します。
たとえば、「リンゴ」は「果物」の一種であり、この関係は「リンゴ is a 果物」と表現できます。この場合、「果物」は「リンゴ」の汎化であり、「リンゴ」は「果物」の特殊型です。同様に、「オレンジ」や「マンゴー」も「果物」の特殊型であり、「果物」はこれらのクラスの共通の性質を抽象化した概念です。
継承と is-a 関係
オブジェクト指向プログラミングでは、is-a 関係は
継承 という概念を通じて具現化されます。サブクラスはスーパークラスの属性やメソッドを継承し、その上で独自の属性やメソッドを追加したり、オーバーライドしたりすることができます。
たとえば、「リンゴ」クラスは、「果物」クラスが持つであろう「果肉に種がある」といった共通の性質を継承します。さらに、「リンゴ」クラスは「赤色である」「丸い形である」といった固有の属性を持つことができます。継承は、コードの再利用性を高め、保守性を向上させる重要なメカニズムです。
has-a 関係との比較
is-a 関係と対比される関係として、
has-a 関係があります。has-a 関係は、あるクラスが別のクラスを構成要素として持つことを示す関係です。たとえば、「自動車」は「エンジン」をhas-a関係で持ちます。これは、「自動車 is a エンジン」とは言えません。自動車はエンジンを所有している(has-a)という関係性です。is-a 関係と has-a 関係は、クラス間の異なる種類の関係を表現するために重要です。
is-a 関係の曖昧さ
オブジェクトと従属するオブジェクトの論理的な関係が is-a なのか has-a なのかを常に明確に判断できるとは限りません。このような曖昧さが、is-a のようなメタ言語的な用語を生み出す一因となっています。設計の状況や観点によって、異なる解釈が可能な場合があります。そのため、設計者はそれぞれの関係性を注意深く分析し、最も適切にクラス間の関係性を表現する必要があります。
関連用語
has-a: あるクラスが別のクラスを構成要素として持つ関係
part-of: あるオブジェクトが別のオブジェクトの一部である関係
集約: 複数のオブジェクトが集合として扱われる関係(has-aの一種)
コンポジション: 集約よりも強い依存関係を持つ複合関係(has-aの一種)
包含: 他のオブジェクトを内部に持つ関係
継承: スーパークラスの属性やメソッドをサブクラスが受け継ぐメカニズム
派生型: スーパークラスから派生したサブクラス
リスコフの置換原則 (LSP):
派生型はスーパークラスの代わりに使用できるという原則
ソフトウェア工学: ソフトウェア開発に関する工学的原則や方法論
参考文献
Ronald J. Brachman; What IS-A is and isn't. An Analysis of Taxonomic Links in Semantic Networks; IEEE Computer, 16 (10); October 1983 [1]
* Jean-Luc Hainaut, Jean-Marc Hick, Vincent Englebert, Jean Henrard, Didier Roland: Understanding Implementations of IS-A Relations. ER 1996: 42-57 [2]