Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

スーパー!

ネタ元:『Modern C++ Design』雑感 - スーパー/サブクラス?@Faith and Brave

C++では「スーパークラス」「サブクラス」という呼び方は推奨されていないはず(『C++の設計と進化』でBjarne氏が言っている)
理由はもちろん、派生したクラスの方が多機能だからだ

C++では「基底クラス」「派生クラス」って言いますね。この呼び方の是非はさておいて、ここではこのC++用語を使いましょう。
Javaでは「スーパークラス」「サブクラス」って言います。C#のbaseにあたるキーワードもJavaではsuperですね。

派生クラスの方が多機能なのに、どうして機能の少ない方が「スーパー」なの?
その疑問はごもっとも。というわけでちょっと解説してみましょう。

先日のオブ熱イベントでも言いましたが(これ引っ張るなぁw)、クラスとはオブジェクトの集合だと考えられます。
集合にとっての「スーパー」、すなわち「スーパー集合」「すごい集合」とは何でしょう?
一言で言えば「デカいこと」、つまり、含むものが多い集合の方が、より「スーパー」です。

日常的にも、「Windows Vista Home PremiumはHome Basicのスーパーセットだ」とか言いますよね。
集合ってのは英語で言えばセットですから、スーパー集合はスーパーセットです。
ちなみに、逆の表現をすれば、「Home BasicはHome Premiumのサブセットだ」となります。
「スーパーセット」「サブセット」というのは集合論の用語でもあり、「セット」を「クラス」に置き換えれば、そのまま「スーパークラス」「サブクラス」になります。

さて、このたとえ話はよけい事態をわかりにくくしてしまったでしょうか?
Windows Vistaの例を用いれば、確かに機能が多い方が「スーパー」ですね。

Windows Vista自体をひとつの集合と見るならば、それは「機能の集合」と言えます。
ということは、多機能ならばそれだけ含むものが多い集合なのですから、スーパーセットなのです。

ここで発想の転換です。「機能」は忘れてしまいましょう。
Vistaについてもそうです。一段階抽象化して、「多機能だからスーパー」ではなくて「含むモノ(Vistaで言えば機能)が多いからスーパー」と考えます。

クラスの関係についても抽象化して考える必要があります。
クラスを集合として捉えるならば、派生クラスは基底クラスを含む集合です。
基底クラスの方が低機能だとすると、「低機能なものは、高機能なものを含む」となってしまいます。変ですね。
基底クラスは、機能が「少ない」のではなく、「曖昧」なのです。
派生クラスは機能が「多い」のではなくて、より「具体的」なのです。
正しい関係は、「機能が有るかもしれないし無いかもしれないものは、機能が有るものを含む」です。
基本的に、クラスの継承関係は、機能の多寡ではなく、その曖昧性/具体性で決まるのです。

なお、数学では、クラスの特性を「内包」といい、そのインスタンスを列挙したものを「外延」と言います。
内包が具体的な(情報量が多い)ほど外延は少なく、内包が曖昧(情報量が少ない)ほど外延は多くなります。

具体例を出しましょう。
クラスはインスタンスの集合ですから、より多くのインスタンスを含む方をスーパークラスとします。
毎度おなじみSystem.Windows.Forms名前空間のControlクラスとButtonクラス。Controlの方が基底クラスです。
さて、ControlとButtonでは、どちらがインスタンスの数が多いでしょうか?

実際には、メモリが許す限り作れるのでしょうから、数を数えてみるというのは現実的ではありません。
しかし、継承関係を考えれば、Button以外にも、TextBoxもLabelもFormも、全部Controlクラスのインスタンスの一種です。
ここから、Controlクラスの方が、含むインスタンスが多いことは明らかですね。
よって、Controlの方がスーパークラスなのです。

余談ですが、仮にメモリの容量が無限にあったとして、無限個のButtonのインスタンスと無限個のControlのインスタンスがあったとしたら、どっちのほうが多いのでしょう?
この場合は、数学の言い方では、「Controlの方が濃度が大きい」ということになる…のかな? 自信ありません。

では、機能の多寡に着目したらどうでしょうか?

Control c = new Button();
Button b = new Button();

さて、cbでは、どちらの方が機能が多いですか?
インスタンスが同じなのに、キャストするたびに機能が増えたり減ったりするというのはおかしな話ですから、機能の多寡は、一概にクラスでは決まらないということがわかるでしょう。

投稿日時 : 2007年8月29日 13:43

Feedback

# re: スーパー! 2007/08/29 14:05 R・田中一郎

すーぱーふぁみこんと、ふぁみこんは、ふぁみこんがすーぱー!!(`・ω・´)

# re: スーパー! 2007/08/29 14:10 ddnp

以前Javaもかじったc/cpp大好きっこですが、
スーパーでしょ。日本語ではよく"超"という字に翻訳されますよね。
で、超。超える。超過。

privateに継承して機能を絞り、余計な汎用性(抽象度)殺した場合
機能は減ってる?いや数じゃなくて質ならどうだ?となるわけで。

大体スーパーの対比、サブってのもよく分からなくて。
特化して使いたいからわざわざ派生させるんであって、
文字通りsub, サブルーチンのサブ。
それはさすがになんか、意味合い的に違うだろ・・・

などというわけで、Javaで何か実装することになったら
それが流儀なので従いますけど、
スーパークラス/サブクラスという呼称はわしゃ大嫌い。

...と言ってみるてすt

# re: スーパー! 2007/08/29 14:12 IIJIMAS

>内包が具体的な(情報量が多い)ほど外延は少なく、内包が曖昧(情報量が少ない)ほど外延は多くなります。

その筋の人はこのような対応をGalois対応と呼ぶみたいです。

# re: スーパー! 2007/08/29 15:17 凪瀬

> 「Controlの方が濃度が大きい」
有限集合なら濃度(基数)はControlの方が大きいのですが無限集合ではどちらも同じく可算濃度になりますよ。
アレフ・ゼロってやつ。

# re: スーパー! 2007/08/29 15:30 アキラ

まー、スーパー/サブクラスと基本/派生クラスは
どっちで説明するのがわかりやすいかですよ

間違えやすい方で覚えると混乱をまねくので

なのでこの呼称には「オブジェクト指向的な意味合い」
は考えないようにしています

個人的には親/子クラスが好きなんですけどね

# re: スーパー! 2007/08/29 17:14 シャノン

> 無限集合ではどちらも同じく可算濃度になりますよ

ほほー。
無限個のControlと無限個のButtonを1対1対応させても、まだ対応させきれないTextBoxやらFormやらがあるから…と思ったのだけれど、そういう話ではない?

# re: スーパー! 2007/08/29 19:54 凪瀬

無限だから余らないんですよ。
無限+100とか無限*2とかはやはり無限なんですよ。
しかも、おなじ加算濃度の無限。

自然数の集合に対し、1対1で対応付けできれば加算濃度といわれるわけですが、無限集合になると終わりがないので、例えば自然数と整数(負の数も含む)でも1対1に対応付けできてしまう。

カントールの対角線論法を調べると、濃度が高い無限というものが掴めるかと思いますよ。
http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%B3%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E5%AF%BE%E8%A7%92%E7%B7%9A%E8%AB%96%E6%B3%95

# re: スーパー! 2007/08/30 19:54 シャノン

そうそう。肝心なことを言い忘れた。
直感的でないと、そう言われてしまったらどうしようもない。理屈でどうにかできるもんじゃない。

ただまぁ、印象を言わせてもらえば、みんなオブジェクトやクラスの「機能」という観点に囚われすぎているような気がする。

# re: 数学とか。 2007/10/22 11:36 .COM -どっとこむ-

re: 数学とか。

タイトル
名前
Url
コメント