メッセージとは何か

ここに書いておけば、もしかすると検索に引っかかって理解の助けになるかも知れないので書いておきます。

Person* taro = new Person( "太郎" );
Vegetable* veg = new veg();
taro->eat( veg );

を例に Pharo で説明してみます。Pharo は Smalltalk 処理系の一つです。
行数を説明上書いてあります。

1: | aPerson aVegetable |
2: aPerson := Person new name: '太郎'
3: aVegetable := Vegetable new.
4: ^ aPerson eat: aVegetable

1行目。
一時変数の定義です。Pharo では「|」で括って一時変数を定義します。

2行目
Person クラスのインスタンスを作り、aPerson 変数に代入しています。
Person クラスに new メッセージを送ると Person のインスタンス(=オブジェクト)を作ります。
Person オブジェクトに name: '太郎' メッセージを送ると、内部で持っているであろう名前のインスタンス変数に「太郎」を設定します。
(Person クラスはそういう風に実装してくださいw)

3行目
Vegetable クラスのインスタンスを作り、aVegetable 変数に代入しています。
Vegetable クラスに new メッセージを送ると Vegetable のインスタンスを作ります。

4行目
aPerson 変数に格納された Person オブジェクトに eat: メッセージを送り、結果を返します。
eat: メッセージは Vegetable オブジェクトを引数に取ります。
(太郎さんは野菜しか食べないのかな? 元となるコードからはこれ以上の事はわかりません。)


このように見てきたように、メッセージとはオブジェクトに送られるものを言います。
Pharo においては、

anObject message

と書き、anObject に message を送ると読みます。メッセージの書き方は数種類ありますが、基本は上記の書き方になります。
メッセージを受け取る側を「Receiver」と言い、メッセージを送る側を「Sender」と言います。
ここでは、「anObject」が Receiver です。Sender は何でしょうか? Sender は「あなた*1」です。
オブジェクトにはメッセージを送るだけです。どこどこのオブジェクトに実装されているメソッドを実行する、なんていう書き方はできません。実際にどのメソッドが実行されるかは、Receiver に任されます。

いくつか例を書きます。(「"」で括られている部分はコメントです。)

"Transcript に「Hello, World」を表示する。"
Transcript show: 'Hello, World'; cr
"2 の平方根を求める"
2 sqrt
"Transcript に 1 から 10 まで表示する"
1 to: 10 do: [:value | Transcript show: value printString; cr]
"100 をインスペクタで表示する"
100 inspect

さて、C++JavaC# で「メッセージを送る」と言うときは、単にメソッド呼び出し(=関数呼び出し)です。
上記の入門本を持っていて、「メッセージを送る」という言葉が出てきたら、赤線を引いて「メソッドを呼び出す」と書き換えてください。
あまりにも赤線を引くのが面倒くさくなったら、その本をビリビリに破いてゴミ箱にぶちこんだほうが良いでしょう。

以上になります。
メッセージとは何か、おわかりいただけたでしょうか?

*1:Smalltalk 処理系では、人間であるあなたも1つのオブジェクトとして扱われます。ただし、「創造力」を発揮できる不思議な能力を持ったオブジェクトで、「精神」と呼ばれるところから「メッセージ」が湧き上がって出現してきます。この大いなる謎は、最先端の科学技術であっても未だに解明できていません。