アプリ版:「スタンプのみでお礼する」機能のリリースについて

継承:基本クラスの要素を引き継いだ新たなクラスを作成する
カプセル化:private
多様性:オーバーロード(同一名の関数で引数を変えることで別の動きをする)

が3大要素で合っていますよね?

メッセージパッシングがいまいち理解できません。
例えば範囲外の要素を代入したら-1(エラー)を返すみたいなものですか?

A 回答 (3件)

「オブジェクト指向」における「メッセージパッシング」だと, ふつうは #1 にあるように「オブジェクトにメッセージを送る」というイメージだろうなぁ. #2 の後ろにある「これがメッセージパッシングです」はなんかずれてる感じがする.



もっと単純にいえば「オブジェクトに対して命令する」というのが「メッセージパッシング」だ, といってもだいたいあってる.

あとついでにいうと #1 の「多態性」というのは「同じメッセージでもレシーバー (受け取るオブジェクト) によって異なる動作をする」というやつだ. 英語でいうと polymorphism.
    • good
    • 0

うーん、メッセージパッシングが何か、と言うと、一応



「(通常の)オブジェクト指向だと隠蔽されてるから気にせんで良い」

ってのが一つの答えになるんじゃないでしょうか。
そうじゃないと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 …
    • good
    • 0

>が3大要素で合っていますよね?



多様性じゃなくて多態性でしょう。
オーバロードは多重定義でオブジェクト指向必須ではありません。
メッセージパッシングはメソッドの呼び出し。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!