
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
「オブジェクト指向」における「メッセージパッシング」だと, ふつうは #1 にあるように「オブジェクトにメッセージを送る」というイメージだろうなぁ. #2 の後ろにある「これがメッセージパッシングです」はなんかずれてる感じがする.
もっと単純にいえば「オブジェクトに対して命令する」というのが「メッセージパッシング」だ, といってもだいたいあってる.
あとついでにいうと #1 の「多態性」というのは「同じメッセージでもレシーバー (受け取るオブジェクト) によって異なる動作をする」というやつだ. 英語でいうと polymorphism.
No.2
- 回答日時:
うーん、メッセージパッシングが何か、と言うと、一応
「(通常の)オブジェクト指向だと隠蔽されてるから気にせんで良い」
ってのが一つの答えになるんじゃないでしょうか。
そうじゃないとC/C++で理解するのはちと厄介な気がします。
簡単な例を挙げます。
例えば「関数を使って2つの整数を足し算して表示せよ」って問題を考えてみましょう。
Cでフツーに書けば大体恐らく次のようなコードになりますね(ちょっと問題に合わせて恣意的ですが)。
// ここから
#define BUF_SIZE 128
char* add(int x, int y);
int main(void) {
puts(add(1, 2)); /* 例えば「1+2」を計算/表示してみる */
return 0;
}
char* add(int x, int y) {
static char buffer[BUF_SIZE];
sprintf(buffer, "%d", x + y); /* x + yの結果を文字列へ変換 */
return buffer; /* 返り値 */
}
// ここまで
addって関数は文字列を「返し(return)」ます。これをputsが受け取って表示する。
まあ、これは簡単ですよね。
ところが、メッセージパッシングの形式だと・・・これ全く実用的ではないんですが(笑)、次のように書きます。
// ここから
#include <stdio.h>
#define BUF_SIZE 128
void add(int x, int y, int (*cont)(char*));
int main(void) {
add(1, 2, (int (*)(char*))puts); /* 「1+2」の計算結果をputsに「送る」 */
return 0;
}
/* 整数x、yだけじゃなくって第三引数 cont を用意する。 */
void add(int x, int y, int (*cont)(char*)) {
static char buf[BUF_SIZE];
sprintf(buf, "%d", x + y);
cont(buf); /* bufと言う「メッセージ」を第三引数 cont に「送る」形式にする */
}
これがメッセージパッシングです。返り値を「返す」んじゃなくって、別の対象(この例の場合は第三引数cont)を作っちゃって、それに向けて「結果を送る」カタチで書く形式を言います。
この形式で書くのは全く薦めませんが(笑)、要するに「メッセージを送る対象」と言うのは、この例だと関数にしたんですが、理論的には何でも良い、って事で、要するに「内部的に」、この送られる対象が「オブジェクト指向のオブジェクト」だったら結果「メソッドの呼び出し」に等しくなる、って事ですね。
詳しい話は次のページを参考にしてみて下さい。
(説明にはSchemeと言う言語が用いられています)
SchemeとActor理論:
http://kreisel.fam.cx/webmaster/clog/img/www.ice …
No.1
- 回答日時:
>が3大要素で合っていますよね?
多様性じゃなくて多態性でしょう。
オーバロードは多重定義でオブジェクト指向必須ではありません。
メッセージパッシングはメソッドの呼び出し。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 エラーの原因がわからな...
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
パスカルのピラミッドを作りた...
-
非再帰のマージソートについて
-
ラップ関数とはどんなものですか?
-
このプログラミング誰か教えて...
-
【C++】関数ポインタの使い方
-
毎回違う乱数を生成するにはど...
-
アスタリスクでダイヤ型を作る
-
数字列を3桁ごとにカンマで区切...
-
ブロックで };ついているのと...
-
opencvで特定の座標を指定しそ...
-
リッチテキストへの行ごとの背...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報