継承 (プログラミング)
差分プログラミング(difference coding)とは、クラス間の共通構成を、各クラスの特有構成に引き継がせるようにして、重複構成の削減と、分類体系化をもたらすことを目的にした継承の用法である。これは、クラスに新機能を付け足しての手軽なクラス拡張目的と、クラスの共通部分を括りだして体系化するクラス分類目的の双方に使われた。
差分プログラミングは、継承の元々の用法であり、プログラムの再利用性と保守性を高めると見なされていたが、後年になると階層分散配置されたデータとメソッドの把握のしづらさによる弊害の方が目立つようになって、この用法を否定する傾向が強くなった。同時にその代替としての合成(英語版)が重視されるようになっている。
サブタイピング(subtyping)とは、スーパークラスのインスタンスを、サブクラスのインスタンスで安全に代替できることを指針にした継承の用法である。基底クラスの変数への、派生クラスのインスタンスの安全な代入可能性(substitutability)を保証している。これはIs-a関係とも言われる。サブタイピングでは、派生側でのフィールドの追加は抑制され、基底側からのメソッド実装の引き継ぎも抑制されており、基底側からのメソッド定義(メソッドシグネチャ)の引き継ぎが重視されている。派生インスタンスが代入された基底変数のメソッド名から派生メソッド内容が呼び出される言語機能は、メソッドオーバーライドと呼ばれ、その機能概念は動的ディスパッチ(英語版)と呼ばれる。サブタイピングは動的ディスパッチに焦点を当てた継承と解釈できる。
具象メソッド(定義+実装)の引き継ぎは実装継承(implementation inheritance)またはコード継承(code inheritance)と呼ばれており、抽象メソッド(定義だけ)の引き継ぎは界面継承(interface inheritance)と呼ばれている。
Is-a関係サブタイピング主体の継承関係は、UMLクラス図では汎化/特化の関係に投影されている。抽象メソッドだけで構成される純粋抽象クラスは、インターフェースと呼ばれており、それとの継承関係はUMLクラス図では実現/実装の関係に投影されている。
サブタイピングのコーディング例はこうなる。