C++のARM(注解 C++リファレンスマニュアル; The Annotated
Reference Manual)を読んでいます。
基底クラス(base class)とスーパークラス(super class)という
2つの用語のニュアンスの違いについての記述が
興味深かったので、書いておきます。
基底クラスと派生クラスという用語は、代替案であったスーパークラス(superclass)とサブクラス(subclass)を押しのけて選択された。その理由は、どっちがどっちであるかという混乱が、Simulaの利用者によって既に体験されているためである。同様の問題は、Object Pascalの利用者においても発生している。混乱の一部は、スーパークラスがそのサブクラスの属性の部分集合を含んでいるという意見と、スーパークラスは、そのサブクラスを表現しているオブジェクトの部分オブジェクトとして表現されているという意見から生じている。
M.A. エリス, B. ストラウストラップら:注解 C++リファレンスマニュアル p.247
つまり、super class と sub classの対は、super-set, sub-setという
集合に関する既に知られた用語との間に齟齬があるということです。
なるほど、例えば、基底クラスとして「図形」、派生クラスとして
「三角形」、「四角形」、「円」を考えてみましょう。
- 「図形」の属性として、「面積」と「周囲の長さ」があるとします。
- さらに三角形には、属性として3つの「頂点の座標」があり、
- 四角形には4つの「頂点の座標」が、
- 円には「中心の座標」と「半径」があるとします。
概念の包含関係と属性の包含関係は逆
属性についてみてみると、「図形」クラスの2つの要素は、
派生クラスである「三角形」クラス・「四角形」クラス・
「円」クラスの共通項であり、部分集合といえます。
しかし、クラスの概念としては、むしろ「三角形」の方が
「図形」の部分集合である、という倒錯があるわけです。
なので、オブジェクト指向の用語としては「スーパークラス」
という用語がはじめ採用されたけれど問題があり、
のちに「基底クラス」という用語が採用されるようになった
ということです。
同じ概念に「基底クラス」・「スーパークラス」という2つの
紛らわしい用語があるのには、ちゃんと理由があったのですね。