人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

オブジェクト指向について教えてください。

質問サイトで「オブジェクト指向をわかりやすく教えてください」という
質問をいくつか見ました。
回答者の方は車や料理を例にとって説明してくださいます。

料理の例では「切る」「焼く」などをパーツとして用意しておくことで
魚を切る、肉を切るなど、パーツを流用していく事を説明されています。

これってC言語で関数を自作する場合の考え方と何が違うのでしょうか?
「切る」という関数、「焼く」という関数を作っておき、魚や肉を引数に
するといった事はC言語でよく使われる方法だと思うのですが。

#もちろん、C言語でオブジェクト指向プログラミングができないわけでは
ないのだと思いますが、上記のようにパーツを関数で用意するのはC言語で
よく行うことではないのかなと思い、質問させていただきました。

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● 匿名回答1号
ベストアンサー

C言語で関数を作るのと大きく異なる点が、多態性です。

魚と餅では焼き方が違うじゃないですか。(魚は殿様に焼かせろ、餅は乞食に焼かせろなんて言いますよね)

そこで、その焼き方というのを魚・餅にそれぞれ持たせて同じ「焼く」という名前を付けます。同じ名前で別々の動作が呼び出されるので多態と呼ぶわけですが、
食材リストについて「全要素について"焼け"」と指示すれば、各食材がそれにあった焼き方をしてもらうようなことができるわけです。


匿名回答2号さんのコメント
材料 r = new 秋刀魚 調理器具 t = new 魚焼きグリル t.焼く (r) # 旨っ r = new 玉ねぎ t.焼く (r) # まずっ! t = new フライパン t = (new 材料コンポジット).add (玉ねぎ、オリーブオイル) t.焼く (r, 弱火) # 旨っ r = (new 材料コンポジット).add (玉ねぎ、キノコ、バター) r = (new アルミホイル).wrap (r) t = new オーブン t.焼く (r) # ホイル焼きの完成

匿名質問者さんのコメント
お二人とも早速のご回答ありがとうございました。 何か、もやが晴れる感じがしました。 ご回答もわかりやすく面白く(笑)、自分としてはよくわかったと思います。 Javaなどでオブジェクト指向プログラミングをしたことはまだないのですが、 教えていただいた差分を意識して勉強してみます。ありがとうございました。

匿名回答1号さんのコメント
ふむ。「焼く」を調理器具が持つメソッドと解釈してきましたか… たしかに食材ごとの「焼く」、調理器具ごとの「焼く」がありえて、 つまり、食材と調理器具の組み合わせごとに別々の「焼く」があるってことになります。 このように、組み合わせごとに異なる処理の仕方がある状況は、一般的なオブジェクト指向プログラミングではやはり解決できません。多重ディスパッチといいます。 食材と調理器具のような2ジャンルの組み合わせまでなら2重ディスパッチといってオブジェクト指向の枠内でも面倒くさいながら表現は可能ですが(ダブルディスパッチパターンとか、Visitorパターンとか呼ぶ技法を使います)。

匿名質問者さんのコメント
入れ違いでまたまた回答ありがとうございました。 もはや呪文・・・。勉強始めたら1号さんの2度目の回答も 理解できるようがんばってみます^^;
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ