[ruby-list:50626] Re: Ruby の用語:クラス,モジュール,インスタンス
From:
Shugo Maeda <shugo@...>
Date:
2017-12-26 04:24:17 UTC
List:
ruby-list #50626
前田です。 2017年12月26日 9:00 5.5 <5.5@moji.gr.jp>: > Ruby の基本的な用語で,自分の中でちょっと曖昧なものがあるので, > 確実なところを把握したいと考えています。 > あるいは,用語によっては意味が確定していない(合意がない)もの > もあるかもしれませんが。 > > > まずはクラスやインスタンスについてお尋ねします。 > オブジェクト指向言語一般の話ではなく,Ruby 用語についての質問 > です。 > > > [1] クラスとモジュールの関係 > > Class は Module の下位クラスです。 > よって,「クラスはモジュールでもある」と言えそうですが,これは > 正しいでしょうか。 > > Class は Module のすべてを受け継いでいるわけではなく,一部のメ > ソッドを未定義にしているところがビミョーな気がします。 例えば、クラスはモジュールと違ってincludeできないといった制約もあるので、 「クラスはモジュールでもある」と考えるのは一般的ではないと思います。 > [2] クラスの上下関係 > > 次の用語はそれぞれまったく同じ意味であると解してよいでしょうか。 > > ・上位クラス,スーパークラス,親クラス > ・下位クラス,サブクラス,子クラス Rubyでは「上位クラス」や「親クラス」とはあまり言わないように思いますが、 そういった表現が使われている場合はスーパークラスのことだと考えてよいように 思います。 > (以下,これが正しいと仮定して進めます) > > class A; end > class B < A; end > class C < B; end > > とあったとき,C は B の下位クラスだが,A の下位クラスであると > は呼ばない,ということでよろしいでしょうか。 > > そうだとすると,「下位クラスまたはその下位クラスまたはその…」 > に当たる用語が欲しいと思います。 > > 「子孫クラス」「先祖クラス」という用語があればよさそうですが, > あまり用例を見ない気がします。 Module#ancestorsは「先祖」ですので、上記のように呼んでもよいように思います。 JIS X 3017では上記の祖先クラスのことを「スーパークラス」と呼んで、代りに 「直接のスーパークラス」という用語を導入していますが。 > [3] クラスとインスタンスの関係 > > クラスが [2] のように定義されているとき,B.new は B のインス > タンスであるが,A のインスタンスとは呼ばない,ということでよ > ろしいでしょうか。 > > だとすると,B や C のインスタンスを A から見た呼び方が欲しい > ですが,そういう用語はありませんでしょうか。 JIS X 3017では、B.newの評価結果を「Bの直接のインスタンス」や「Aのインスタンス」 と呼んでいます。 > また,B.new のクラスは B ただ一つであり,A は該当しない,と > いうことでよろしいでしょうか。 そういう解釈が一般的だと思います。 > [4] 〇〇オブジェクトという呼び方 > > Array のインスタンスを「Array オブジェクト」と呼びますね。 > Array の下位クラスのインスタンスをも「Array オブジェクト」と > 呼ぶことは妥当でしょうか。 > > また,Enumerable をインクルードしたクラス(やその下位クラス > 等々)のインスタンスを「Enumerable オブジェクト」と呼びたい > のですが,妥当でしょうか。 > > これを一般化して,オブジェクト o のクラスの ancestors たち > (つまり o.class.ancestors の要素)すべてについて,o のこと > を「〇〇オブジェクト」と呼べれば,と思うのですが。 > > それがダメなら,それを簡潔に表す方法はありませんか。 「直接のインスタンス」という用語を導入すれば、「〇〇インスタンス」でよい と思いますが、Rubyの場合はModuleとClassのようにリスコフの置換原則に従わ ない例があるので、そういった場合は「Moduleインスタンス」と呼ぶことにあま り意味はないかもしれません。 -- Shugo Maeda