オブジェクト指向の説明(初級変)
class モノ { property: 幅; property: 高さ; property: 凝固状況; } class 一杯のかけそば extends モノ { property: 幅 = 100; property: 高さ = 150; property: 凝固状況 = "液体"; } class 容器 { property: 幅; property: 深さ; property: 防水; property: 内容物; function 取る() { return this->内容物; } function 容れる(モノ, 無理矢理 = "無理ならいいや") { switch (モノ->凝固状況) { case "気体": die "無茶"; case "液体": if (this->防水 == 'じゃない') { warning "漏れるゾ"; } if (モノ->幅 * モノ->深さ > this->幅 * this-> 深さ) { if (無理矢理 == "無理ならいいや") { warning "容れませんよ"; } else { warning "溢れるって"; } } break; case "固体": if (モノ->幅 * モノ->深さ > this->幅 * this-> 深さ) { if (無理矢理 == "無理ならいいや") { warning "容れませんよ"; } else { die "壊れた。。。"; } } break; default: warning "それ、なに?"; } this->内容物 = モノ; } function 防水?() { if (this->防水 == 'じゃない') { return '防水じゃないよ'; } else { reutrn '防水だよ'; } } } class コーヒーカップ extends 容器 { property: 幅 = 50; property: 深さ = 60; property: 防水 = "だよ"; property: 取っ手 = "普通の取っ手"; }
非常に悩ましい問題ではあるのだが、コーヒーカップを持つのは人だから、コーヒーカップが「持つ」というメソッドを持つのは不自然だ。
とすると上記クラスを利用する側は以下のようになる。
function 優雅に持つ(入れ物) { switch (入れ物->取っ手) { case "エレガントな取っ手": return "100点"; case "普通の取っ手": return "50点"; case "貧相な取っ手": return "-15点"; case NULL: die "落としました"; default: return "0点"; } } 食べ物 = new 一杯のかけそば(); 入れ物 = new コーヒーカップ(); 入れ物->取っ手 = "貧相な取っ手"; 入れ物->容れる(食べもの); 優雅に持つ(入れ物);
さらに悩ましいのは、これだと容器が壊れたことを容器自身が知らないということだ。とはいえ容器に「壊す」とか「落とす」いうメソッドを用意するのも面白くない。
そうやってうんうん考えていくと、んじゃそもそも「容器」が「容れる」とか「取る」とかいうメソッドを持つこと自体もおかしいという話になってくる。
果たして、容器自体が持つメソッドというのはなんだろうか。