クラスの継承は間違いなくオブジェクト指向。
Simulaから始まっている。
部分型は、オブジェクト指向がもっていた継承を、理論的に整理したといえそう。
オブジェクト指向がもつ継承に対してリスコフが直観的な原則として置換則を提示し、その後に型理論として整理され型安全性が証明された、という流れ。
そこで、クラスの機能を制限して実装や状態を持たせないようにしたインタフェースはオブジェクト指向なのか。
JavaのインタフェースはObjective-CのProtocol由来。静的型に対応させて、型への制約とした。Objective-CのProtocolはアラン・ケイのオブジェクト指向的。そして、Javaのインタフェースは型理論として整理されている。
オブジェクト指向手法の設計や分析では、インタフェースはうまく扱われていないように見える。
UMLでも、とってつけたように<<interface>>と記述したりする。
インタフェースは、オブジェクト指向から現れてはいるけど、多相型やシール型などの型機能との組み合わせを考えると、型理論の道具として扱うほうがいいんではなかろうか。
データに対して可能な操作だけを公開して、実装の詳細は隠すというカプセル化は、抽象データ型から来ている。
多相型は型付λ計算由来で、オブジェクト指向以前からある。
1967年のFundamental Concepts in Programming Languagesという講義ノートによって定義されたらしい。
このノートには他にも「参照透過性」も含まれている。
その後、MLなどで発展したあと、C++にテンプレートとして導入されて広まり、JavaやC#に取り入れられて定着、という感じ。
現代的なプログラムは、型に対して組んでいくという面もあり、そうするとインタフェースをうまく扱おうとするときにオブジェクト指向の勉強をするよりも、型理論の勉強をしたほうがいいとは思う。
型理論入門の大事なところだけ抜き出したかのような、この本もおすすめ。