<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>プログラミング：哲学</title><link>http://blogs.wankuma.com/shannon/category/870.aspx</link><description>プログラミング：哲学</description><managingEditor>αετος / aetos</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>αετος / aetos</dc:creator><title>汎用型を使うときはちょっと注意して欲しい</title><link>http://blogs.wankuma.com/shannon/archive/2009/02/06/167606.aspx</link><pubDate>Fri, 06 Feb 2009 16:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2009/02/06/167606.aspx</guid><description>&lt;p&gt;コードを抽象化して汎用的な部分を切り出す。 &lt;br&gt;基本的にはいいことなのですが、過ぎたるは及ばざるが如しということわざもあります。  &lt;p&gt;&lt;A href="http://blogs.wankuma.com/rti/archive/2009/02/06/167597.aspx"&gt;KeyValuePair&lt;&gt;が意外に使える件&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.aetosfolia.jp/blog/post/2009/02/06/e6b18ee794a8e59e8be38292e4bdbfe38186e381a8e3818de381afe381a1e38287e381a3e381a8e6b3a8e6848fe38197e381a6e6acb2e38197e38184.aspx"&gt;続きを読む&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/167606.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>αετος / aetos</dc:creator><title>Web時代の分散オブジェクト指向？</title><link>http://blogs.wankuma.com/shannon/archive/2009/01/02/165431.aspx</link><pubDate>Fri, 02 Jan 2009 00:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2009/01/02/165431.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/165431.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2009/01/02/165431.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/165431.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/165431.aspx</trackback:ping><description>&lt;p&gt;注：これはまとまっていない思考の断片である。&lt;/p&gt; &lt;p&gt;オブジェクト指向とは、端的に言えば、現実世界に存在する何らかの対象を、プログラム上に抽象化して表現する手法である。&lt;br&gt;抽象化というのは、対象が持つ無限の性質のうち、関心のある一部だけをとりあげることだ（残った無関心な部分を捨てることを「捨象」と言い、抽象と捨象は常に表裏一体である）。&lt;/p&gt; &lt;p&gt;たとえば、りんごオブジェクトがどのような特性を備えるべきかは、どんなシステムを作ろうとしているかによる。&lt;br&gt;果物屋の会計システムだったら「商品」の特性を持つべきかもしれないし、植物図鑑のシステムだったら「バラ科の植物」の特性を持つべきかもしれない。&lt;/p&gt; &lt;p&gt;これまで、この「システム」は閉じたものだった。&lt;br&gt;これが開かれるとき、何が起こるだろうか。&lt;/p&gt; &lt;p&gt;例えば、本を抽象化した本オブジェクトを考える。&lt;br&gt;これには様々な特性――内容、分野、著者、ページ数、出版社、etc――がある。&lt;br&gt;従来のオブジェクト指向では、本のどのような側面に着目するかによって、必要な情報セットを自分で定義していた。&lt;/p&gt; &lt;p&gt;昨今、本の情報を扱うWebサービスを立ち上げようと思ったら、Amazonを利用するのが王道ではなかろうか。&lt;br&gt;Amazonのサービスから取り出せる本の情報は、Amazonが管理しているものだけである。それは、本をオンライン上で販売するために必要な情報と言っていい。&lt;br&gt;Amazonのデータベースが広く公開されることで、様々な新しい可能性が拓けてくるのは周知の通りだろう。&lt;br&gt;ここで、Amazonを通じて売買するものという以外の側面から「本」を捉えることが、当然可能である。&lt;br&gt;すなわち、Amazonから取り出せるデータだけでは足りなくなってくる。&lt;/p&gt; &lt;p&gt;要するに、「本」というものを抽象化するにあたって、複数の視点があり、それらが協調して、インターネットという単一のシステムを構成することが現実的になりつつある（この巨大なシステムは決して完成することが無く、情報セットは絶えず変動し得る）。&lt;br&gt;この時、「本」はどのような特性を持っていて、それはどこのサービスから取り出せるか、また、他のどの情報と連携しているかといったようなメタデータが必要になってくる。&lt;/p&gt; &lt;p&gt;というようなのを織り込んだ体系があっても面白いなぁ、と思った、2008年最後の夜だった。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/165431.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>インターフェイスの要件は最小であるべきか？</title><link>http://blogs.wankuma.com/shannon/archive/2008/07/17/149365.aspx</link><pubDate>Thu, 17 Jul 2008 16:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/07/17/149365.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/149365.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/07/17/149365.aspx#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/149365.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/149365.aspx</trackback:ping><description>&lt;P&gt;なんだかぱっとしないタイトル。&lt;BR&gt;ここで言う「インターフェイス」とは、多重継承できるあの interface じゃなくて、もっと一般的な意味でのそれです。約束事、みたいな。&lt;/P&gt;
&lt;P&gt;例えば、メソッドの引数に何かコレクションを受け取るとして、その型はどう宣言すべきか、と。&lt;BR&gt;IEnumerable&amp;lt;T&amp;gt; か、ICollection&amp;lt;T&amp;gt; か、IList&amp;lt;T&amp;gt; か、はたまた T[] か。&lt;/P&gt;
&lt;P&gt;極めて単純無思考には T[] 。&lt;BR&gt;しかし、T[] のほとんどの特性は IList&amp;lt;T&amp;gt; も備えているため、俺は個人的に IList&amp;lt;T&amp;gt; を好む傾向にある。&lt;BR&gt;多次元配列なんかは、もはや配列をそのまんま使うんじゃなくて、何らかのクラスを作ったほうがいいと思う。&lt;/P&gt;
&lt;P&gt;しかし、ランダムアクセスの必要が無ければ、IEnumerable&amp;lt;T&amp;gt; でも十分ではある。&lt;BR&gt;そういう時、IEnumerable&amp;lt;T&amp;gt; とすべきか否か。&lt;/P&gt;
&lt;P&gt;ちょっと引っかかるのは、ICollection&amp;lt;T&amp;gt; や IList&amp;lt;T&amp;gt; は無限リストを許容しないが、IEnumerable&amp;lt;T&amp;gt; は許容するというところ。&lt;BR&gt;ということは、IEnumerable&amp;lt;T&amp;gt; を引数に取るメソッドは、すべからく無限リストに対応すべし、ということになるか？&lt;BR&gt;遅延処理を意図したロジックならいいが、そうでない場合もあるだろう。&lt;BR&gt;IEnumerable&amp;lt;T&amp;gt;.Count() なんかは ICollection&amp;lt;T&amp;gt;.Count でもよかったんじゃないだろうか。無限リストに使ったらオーバーフローしたぞ。&lt;BR&gt;まぁ、ICollection&amp;lt;T&amp;gt; や IList&amp;lt;T&amp;gt; を受け取ったとして、要素数が Int32.MaxValue 個ある場合にちゃんと処理できなければならない、というのもなかなか酷ではあるのだが。&lt;/P&gt;
&lt;P&gt;また、これは感覚的な問題でもあるが、用途としては IEnumerable&amp;lt;T&amp;gt; で十分であっても、IList&amp;lt;T&amp;gt; を使いたいという心情もあると思う。&lt;BR&gt;ちょっと前の var 論争でもあった意見だが、「IEnumerable&amp;lt;T&amp;gt; ではコレクションのような気がしない。IList&amp;lt;T&amp;gt; ならコレクションであるという意図が込められる」みたいな。&lt;/P&gt;
&lt;P&gt;また別問題ではあるが、独自のデータ構造を作るか否かという問題もある。&lt;BR&gt;例えば、Pair&amp;lt;T, U&amp;gt; という既存の型があった場合、あらゆる2値の組み合わせは Pair&amp;lt;T, U&amp;gt; で事足りるか、ということ。&lt;BR&gt;Pair&amp;lt;T, U&amp;gt; は、それぞれの値の意味を理解しないので、.First とか .Second とかいうメンバ名にならざるを得ない。&lt;BR&gt;人の名前を表すのに、FirstName と LastName というメンバを持つクラスを作るか、Pair&amp;lt;string, string&amp;gt; で済ませるか、とか。&lt;BR&gt;独自のデータ型を作らずに既存の型を最大限活用した場合、&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;メンバの意味がわかりにくくなる &lt;/LI&gt;
&lt;LI&gt;ジェネリックの入れ子が深くなる&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;という問題が発生するわけだが、どうよ？　という。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/149365.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>車なんて…っ！</title><link>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx</link><pubDate>Wed, 09 Jul 2008 13:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/148138.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/07/09/148138.aspx#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/148138.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/148138.aspx</trackback:ping><description>&lt;P&gt;思わずこんなタイトルをつけてしまったが、車ではなくてオブジェクト指向のお話。&lt;/P&gt;
&lt;P&gt;車はガソリンがなければ動きません（ディーゼル他、非ガソリン車はとりあえず置いといて）。最近高いですね、ガソリン。&lt;BR&gt;ご存知のように、ガソリンにはレギュラーと&lt;STRIKE&gt;廃屋&lt;/STRIKE&gt;ハイオクがあります。&lt;BR&gt;レギュラー用のエンジンにハイオクを入れても大丈夫ですが、ハイオク用のエンジンにレギュラーを入れると壊れてしまいます。&lt;/P&gt;
&lt;P&gt;面倒なのでコードは載せません。各々補完してください。&lt;/P&gt;
&lt;P&gt;車クラスとガソリンクラスがあります。&lt;BR&gt;車クラスには、ガソリンのインスタンスを引数に取る給油メソッドがあります。&lt;BR&gt;車クラスから、ハイオク専用車クラスを派生させます。&lt;BR&gt;このハイオク専用車クラスの給油メソッドの引数は、多くの言語ではガソリンになりますが、実際にはガソリンから派生したハイオクガソリンを渡さないと壊れてしまいます。&lt;/P&gt;
&lt;P&gt;I車インターフェイスではなく車クラスから派生させるのは、レギュラー用エンジンを積んでいる車には（悪質なものでない限り）どんなガソリンを入れても大丈夫だからです。この点において、レギュラー車はハイオク車より抽象的です。&lt;BR&gt;ハイオク専用車も車の一種には違いなく、ハイオクガソリンもガソリンの一種には違いないのに、車とガソリンに結合が関係があるとき、これらを継承関係にするとうまく行きません。&lt;/P&gt;
&lt;P&gt;よくある「ペンギンは鳥か？」論によれば、いくつかの結論のパターンがあります。&lt;BR&gt;たとえば、&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;現実世界がどうであれ、このプログラム中では、どんなガソリンでも給油できるものを車と定義したのだから、ハイオク専用車はその意味では車ではなく、車クラスから派生させることは不適当である&lt;/LI&gt;
&lt;LI&gt;ハイオク専用車の給油メソッドでは、実際に給油されたガソリンの動的な型を判別して、ハイオクガソリンでなければ例外を投げればよい。&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;というような。&lt;/P&gt;
&lt;P&gt;1は、「ペンギンは鳥か？」論でもそうですが、常識的に考えて「そんな馬鹿な」と言いたくなります。&lt;BR&gt;まして、ペンギンと鳥は実際にも姿形も生態も大きく異なるのに対し、今回の例では、より違いが少ないだけになおさらです。&lt;BR&gt;2は現実的な解かもしれません。しかし、極論を言ってしまえば、型のエラーをコンパイル時に検出できないなんて、静的型システムに何の意味があるというのでしょうか？&lt;BR&gt;もちろん、完璧主義に走るべきではなく、完全に検出できないからと言って全く役に立たないわけではないという意見は一理あります。&lt;BR&gt;しかし、完璧を求めてうまく行く方法があるとしたら、それを求めないのは罪というものです。&lt;/P&gt;
&lt;P&gt;さて、お題です。&lt;BR&gt;このような状況下でも、静的な型チェックを機能させる方法はあるのでしょうか？&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;こういう仕様の新しい言語を作ればうまく解決できる&lt;/LI&gt;
&lt;LI&gt;既存の言語にこういう拡張を施せばうまく解決できる&lt;/LI&gt;
&lt;LI&gt;実は拡張しなくても既存の言語でうまく解決できる&lt;/LI&gt;
&lt;LI&gt;そもそも問題設定に無理があって、どうやっても解決は無理、または不要&lt;/LI&gt;
&lt;LI&gt;だから動的言語を使えっつってんだろ&lt;/LI&gt;
&lt;LI&gt;他&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;既成概念に囚われない答えを募集します。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/148138.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>喜ぶべきか悲しむべきか</title><link>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx</link><pubDate>Sun, 08 Jun 2008 13:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/142229.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/06/08/142229.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/142229.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/142229.aspx</trackback:ping><description>&lt;P&gt;オブジェクト指向を突き詰めていくと、どうしても動的言語に行き着いてしまう気がする。&lt;BR&gt;考えれば考えるほど、「基底クラスと派生クラスの関係」と「クラスとインスタンスの関係」に違いがないように思えてくる。&lt;BR&gt;「静的型チェック」は「プログラミング」に要請されることではあるが、「オブジェクト指向」に要請されることではないものなぁ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/142229.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>ぶっくまーく</title><link>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx</link><pubDate>Sat, 10 May 2008 15:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/137157.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/05/10/137157.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/137157.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/137157.aspx</trackback:ping><description>&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/minekoa/20080506"&gt;コンパイル時ダックタイピング&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/NyaRuRu/20080504/p2#c"&gt;中の人がどう思っているかと，外からどう思われているか&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.kmonos.net/wlog/85.html#_0905080505"&gt;Structural C++&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/haru-s/20080508/1210226387" name=1210226387&gt;C++ と Structural Polymorphism と型推論&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://d.hatena.ne.jp/minekoa/20080502/1209695216"&gt;LLとOO&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;面倒になったので列挙ストップ。あとは各ページのリンクなりトラックバックなりを辿るべし。&lt;BR&gt;しかし、何が書いてあるんだかさっぱり理解できねぇじゃねーかちくしょうめ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/137157.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>眠れぬ夜の空想</title><link>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx</link><pubDate>Thu, 01 May 2008 12:09:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/135994.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/05/01/135994.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/135994.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/135994.aspx</trackback:ping><description>&lt;P&gt;これはなかなか寝付けない夜にとりとめもなく考えていた空想であり、そのまま考えていては朝になってしまうので強制的に打ち切った思考の断片である。&lt;/P&gt;
&lt;P&gt;人間を、年齢層と性別で分けることを考える。&lt;/P&gt;
&lt;TABLE style="empty-cells: show" border=1&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH colSpan=2 rowSpan=2&gt;&lt;/TH&gt;
&lt;TH colSpan=5&gt;年齢層&lt;/TH&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;10歳未満&lt;/TD&gt;
&lt;TD&gt;10代&lt;/TD&gt;
&lt;TD&gt;20代&lt;/TD&gt;
&lt;TD&gt;30代&lt;/TD&gt;
&lt;TD&gt;&amp;#8230;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TH rowSpan=2&gt;性別&lt;/TH&gt;
&lt;TD&gt;男&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;A&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;女&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;B&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;P&gt;この表全体を「人間クラス」としたとき、AおよびBは何か。&lt;/P&gt;
&lt;P&gt;まず、年齢層や性別を人間クラスのプロパティとし、AやBが入っている表のセルをインスタンスであると考えてみる。&lt;BR&gt;すると、こうなる。&lt;/P&gt;&lt;PRE&gt;enum 年齢層 { 10歳未満, 10代, 20代, 30代, 以下略 }
enum 性別 { 男, 女 }
class 人間 { 年齢層 age, 性別 sex }

人間 A = new 人間(); A.age = 年齢層.30代; A.sex = 性別.男;
人間 B = new 人間(); B.age = 年齢層.10代; B.sex = 性別.女;&lt;/PRE&gt;
&lt;P&gt;表の列も行もセルも、すべてクラスであると考えると、こうなる。&lt;/P&gt;&lt;PRE&gt;class 人間 {}
class 10歳未満の人間 : 人間 {}
class 10代の人間 : 人間 {}
class 20代の人間 : 人間 {}
class 30代の人間 : 人間 {}
class 男 : 人間 {}
class 女 : 人間 {}
class 10歳未満の男 : 10歳未満の人間, 男 {}
class 10歳未満の女 : 10歳未満の人間, 女 {}
中略
class 30代の男 : 30代の人間, 男 {} // A
class 10代の女 : 10代の人間, 女 {} // B&lt;/PRE&gt;
&lt;P&gt;ただし、これは素朴には、こういうことがありうる。&lt;/P&gt;&lt;PRE&gt;class 矛盾した人間 : 10代の人間, 20代の人間, 男, 女 {}&lt;/PRE&gt;
&lt;P&gt;先にずらずらと列挙した例では、例えば「20代の男」は「20代、かつ、男」であった。&lt;BR&gt;すると、この矛盾した人間は、「10代であり20代、かつ、男であり女」になってしまう。&lt;BR&gt;現在の多重継承が可能な言語では、こういうクラスを作ることができてしまう。&lt;BR&gt;だが、意図したところは、「年齢層から１つ、性別から１つを多重継承する」である。&lt;/P&gt;
&lt;P&gt;コンパイルエラーにするにはまだ練り足りないが、もう少しだけ意図を追加してみる。&lt;BR&gt;例えば C# の属性風に。&lt;/P&gt;&lt;PRE&gt;// 人間の具象派生クラスは、年齢層と性別から１つずつを多重継承すること！
abstract class 人間 {}

[ ClassCategory( "年齢層" ) ] abstract class 10歳未満の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 10代の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 20代の人間 : 人間 {}
[ ClassCategory( "年齢層" ) ] abstract class 30代の人間 : 人間 {}
[ ClassCategory( "性別" ) ] abstract class 男 : 人間 {}
[ ClassCategory( "性別" ) ] abstract class 女 : 人間 {}
class 10歳未満の男 : 10歳未満の人間, 男 {}
class 10歳未満の女 : 10歳未満の人間, 女 {}
中略
class 30代の男 : 30代の人間, 男 {} // A
class 10代の女 : 10代の人間, 女 {} // B&lt;/PRE&gt;
&lt;P&gt;さらに C# の延長として、System.Type から複数の親クラス情報を、カテゴリ別に取得できると想定してみよう。&lt;/P&gt;&lt;PRE&gt;Type type = typeof( 30代の男 );
Type ageType = type.BaseTypes[ "年齢層" ]; // ageType == typeof( 30代の人間 );
Type sexType = type.BaseTypes[ "性別" ]; // sexType == typeof( 男 );&lt;/PRE&gt;
&lt;P&gt;ここで唐突に、C# から JavaScript にターゲットを変えてみる。&lt;BR&gt;といっても、これまでの流れから明らかなように、JavaScript チックな実在しない空想言語である。 
&lt;P&gt;JavaScript では、実行時にプロトタイプを変更することができる。&lt;BR&gt;これは、C# のような静的型付けの言語では、親クラスの変更に相当するだろう。&lt;BR&gt;では、多重継承に相当するように、プロトタイプを複数持つことができたとしたら？　ついでに、それが JavaScript お得意の名前つきマップだとしたら？&lt;BR&gt;こんな形になるんじゃないだろうか。&lt;/P&gt;&lt;PRE&gt;（面倒なのでクラス定義を一部省略した）
function 人間() {}

function 30代の人間() {}
30代の人間.prototype = new 人間();

function 男(){}
男.protptype = new 人間();

function 30代の男() {}
30代の男.prototypes[ "年齢層" ] = new 30代の人間();
30代の男.prototypes[ "性別" ] = new 男();&lt;/PRE&gt;
&lt;P&gt;この JavaScript モドキのコードと、一番最初に挙げた C# モドキのコードを見比べてみる。&lt;BR&gt;ちょっと変更して再掲しよう。&lt;/P&gt;&lt;PRE&gt;人間 30代の男 = new 人間();
30代の男.age = 年齢層.30代;
30代の男.sex = 性別.男;&lt;/PRE&gt;
&lt;P&gt;実によく似た形をしている。&lt;/P&gt;
&lt;P&gt;&amp;#8230;というところまで考えて寝た。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/135994.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>制約</title><link>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx</link><pubDate>Tue, 18 Mar 2008 14:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/128309.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/03/18/128309.aspx#Feedback</comments><slash:comments>336</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/128309.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/128309.aspx</trackback:ping><description>「どんなデータでなければならないか」をプログラミング言語で書くのは容易だが、「どんな処理をしなければならないか」を書くのは困難である。&lt;BR&gt;「その処理をした後にデータはどうなっていなければならないか」なら書けるが、それでは「どんな処理をしなければならないか」を完全に代替できない。&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/128309.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>System.Drawing.Point</title><link>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx</link><pubDate>Sun, 17 Feb 2008 00:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/123457.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2008/02/17/123457.aspx#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/123457.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/123457.aspx</trackback:ping><description>&lt;P&gt;２次元座標を表す、おなじみの&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.drawing.point.aspx"&gt;Point構造体&lt;/A&gt;。&lt;BR&gt;こいつがSystem.Drawing名前空間にあることは、ちょっとした不満である。&lt;/P&gt;
&lt;P&gt;理由は簡単で、２次元座標とは、何も描画するときだけに使うものではないからだ。&lt;BR&gt;たとえば&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.location.aspx"&gt;Control.Locationプロパティ&lt;/A&gt;に使われるが、Locationプロパティを設定することは、何かを描画しているという意識なく行われるだろう。&lt;BR&gt;だが、Windowsはウィンドウの移動を裏で描画しているわけだし、また、ピクセル単位での座標指定に使うものであると拡大解釈して、なんとか自分を納得させてきた。&lt;/P&gt;
&lt;P&gt;だが、つい先ほど、ひょんなことから、&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagridview.currentcelladdress.aspx"&gt;DataGridView.CurrentCellAddress&lt;/A&gt;というプロパティを知ってしまった。&lt;BR&gt;この型はPointであるが、単位はピクセルではない。DataGridViewのアクティブセルの行および列のインデックスである。&lt;BR&gt;また、DataGridViewは、この座標を用いて何かを描画することもない。&lt;BR&gt;ここへきて完全に、PointがDrawing名前空間にあることを正当化する理由は消えた。&lt;/P&gt;
&lt;P&gt;だが、いくら文句を言ったところで、Point構造体がDrawing名前空間を脱することはないだろう。&lt;BR&gt;だから、ここから先は妄想の域を出ない話だ。&lt;/P&gt;
&lt;P&gt;そもそも、Point構造体を、座標の単位を意識せずに、単なる２つの座標のペアとして扱うことは正しいのだろうか。&lt;BR&gt;それとも、表すものの単位ごとに異なるデータ型を用意すべきだったのだろうか。&lt;BR&gt;あるいはまた、２次元座標であるという意味さえ捨てて、Pair&amp;lt;int, int&amp;gt;のようなもので統一してしまうことは是なのだろうか。&lt;BR&gt;なかなか難しい問題ではないかと思うが、どうだろう。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/123457.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>シャノン</dc:creator><title>同値関係</title><link>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx</link><pubDate>Tue, 11 Dec 2007 10:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx</guid><wfw:comment>http://blogs.wankuma.com/shannon/comments/112462.aspx</wfw:comment><comments>http://blogs.wankuma.com/shannon/archive/2007/12/11/112462.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/shannon/comments/commentRss/112462.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/shannon/services/trackbacks/112462.aspx</trackback:ping><description>&lt;P&gt;あるインスタンスnがある。このインスタンスの真の型（動的な型）は問わないものとする。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;反射律：nの静的な型がAであるならば、nをAにキャストできる。 
&lt;LI&gt;対称律：nの静的な型がAであり、これをBにキャストできるならば、再度Aにキャストできる。 
&lt;LI&gt;推移律：nの静的な型がAであり、これをBにキャストしてからCにキャストできるならば、直接AからCにキャストできる。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;この特徴は、特にCOMのQueryInterfaceにおいて顕著である。&lt;BR&gt;余談だが、COMのキャスト規則も書いておく。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;反射律：nの静的な型がIFooであるならば、n-&amp;gt;QueryInterface( IID_IFoo,&amp;nbsp;&amp;amp;m ); は成功する。 
&lt;LI&gt;対称律：nの静的な型がIFooであり、n-&amp;gt;QueryInterface( IID_IBar, &amp;amp;m ); が成功するならば、m-&amp;gt;QueryInterface( IID_IFoo, &amp;amp;o ); は成功する。 
&lt;LI&gt;推移律：nの静的な型がIFooであり、n-&amp;gt;QueryInterface( IID_IBar, &amp;amp;m ) が成功し、かつ m-&amp;gt;QueryInterface( IID_IPoo, &amp;amp;o ); が成功するならば、n-&amp;gt;QueryInterface( IID_IPoo, &amp;amp;o ); は成功する。 
&lt;LI&gt;nの型に関わらず、n-&amp;gt;QueryInterface( IID_IUnknown, &amp;amp;m ); は常に成功する。&lt;BR&gt;かつ、m の値は何度実行しても必ず同じになる（IUnknown 以外へのキャストの場合は同じになるとは限らない）。 
&lt;LI&gt;n-&amp;gt;QueryInterface( IID_IFoo, &amp;amp;m ); が一度成功したならば、何度実行しても必ず成功する。&lt;BR&gt;逆に、一度失敗したならば、何度実行しても必ず失敗する。&lt;/LI&gt;&lt;/UL&gt;&lt;img src ="http://blogs.wankuma.com/shannon/aggbug/112462.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>