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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- 高校 述語論理の基本的な質問 3 2022/04/23 10:35
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- HTML・CSS HTMLの・要素・属性・属性値 はプログラム言語の「変数」みたいに変更できますか? 5 2022/10/04 05:27
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
if と配列の組み合わせ
-
足して100になるような乱数のア...
-
このプログラミング誰か教えて...
-
system関数がうまくいかない
-
【C++】関数ポインタの使い方
-
int16_t の _t は何?
-
C#の質問
-
エラー 添字が付けられた値が、...
-
構造体の勉強中です 合計点の高...
-
C言語 配列と関数の練習問題
-
c言語 〇×ゲーム
-
商と剰余を同時に求める(C言語)
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報