質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

572閲覧

メッセージってなんでしょうか?

BeatStar

総合スコア4958

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2グッド

0クリップ

投稿2018/10/06 03:23

編集2018/10/08 01:55

若干ネタ入っていますが。

オブジェクト指向における「メッセージ」が理解できません。

サイトを読んでいる限り、

C++

1Person* taro = new Person( "太郎" ); 2Vegetable* veg = new veg(); 3taro->eat( veg ); // <- これ

みたいな説明しかないです。(私の探し方が悪いのか?)

でもこれって単に関数を呼び出しているだけでは?

C++の入門サイト(どこだったか忘れた...) では「オブジェクトがメソッドを持っているのではなく、関数ポインタ的なものを保持して呼び出しているだけである」のような説明でした。

そこから考えるとメッセージじゃないでしょ。って思ってしまいます。

それとも Test1クラスがあり、Test2クラスのオブジェクトを保持していて、Test1のオブジェクトを使う方はあたかもTest2にまで影響を与えているように見せることでしょうか?

C++

1class Test2{ 2 public: 3 Test2(int num) : num_(num){} 4 ~Test2() = default; 5 6 int num( void ) const{ return num_; } 7 bool update( int code ){ 8 // 何らかの通達があり 9 } 10 private: 11 int num_; 12}; 13 14 15class Test1{ 16 public: 17 Test1( Test2* t ) : test_(t){} 18 ~Test1() = default; 19 20 bool update( void ){ 21 // ここで独自の処理をして 22 test_->update( 100 ); // 通達 23 return true; 24 } 25 private: 26 Test2* test_; 27}; 28 29// main関数のような呼び出し元にて 30Test2* t2 = new Test2(1); 31Test1* t1 = new Test1( t2 ); 32t1->update(); // t1を操作すると 33cout << t2->num() << endl; // t2のデータも変わっている 34delete ...

のように内部に包括しておいて、呼び出し元( main関数等 ) からすれば複数のオブジェクト間でデータ通信があるように見せる...
ってことでしょうか?

ちょっとわかりにくいです。

言語は問いませんが、基本的に使っている言語はC++なのでC++で書いてます。

質問:どのように「メッセージ」を捉えればいいのでしょうか?


[ちょこっと補足]
前者のほうらしいですが、少なくともC++ではメッセージっていうかコマンド(command)とかオーダー(order)じゃないかなと思ったりして...

yohhoy, atata0319👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

もともとSmalltalkを使ってアラン・ケイ博士がオブジェクト指向を提唱したとき、メソッド呼び出しはまさしくメッセージをオブジェクトに送ることでした。Smalltalkのオブジェクト指向の流れを組むRubyではオブジェクトにシンボルを渡しているだけという伝統が残っています。

Ruby

1a.f(x) 2a.__send__(:f, x)

上の二つはほぼ同じことをしています(細かくはアクセス権を無視するなどの違いはありますが)。

対して、C++はSmalltalkとは全く別の観点でオブジェクト指向を定義したため、本来メッセージは関係ありません。もし、オブジェクトにメッセージを送っていると考えるのであれば、virtualではない関数をオーバーライドしたときの動作が奇妙に見えることでしょう。

C++

1#include <iostream> 2using namespace std; 3struct A { 4 void f() { cout << "A#f()" << endl; } 5}; 6struct B : public A { 7 void f() { cout << "B#f()" << endl; } 8}; 9int main() { 10 auto x = new B(); 11 A *a = x; 12 B *b = x; 13 a->f(); // A#f() 14 b->f(); // B#f() 15}

abも同じオブジェクトを指すポインタであるにもかかわらず、呼び出される関数が異なります。メッセージという考えではこの動作を説明することはできません。もし、メッセージであれば下記のCrystalのコードを実行したときのようになるはずです。

Crystal

1class A 2 def f 3 puts "A#f()" 4 end 5end 6class B < A 7 def f 8 puts "B#f()" 9 end 10end 11x = B.new 12a = x.as(A) 13b = x.as(B) 14a.f # B#f() 15b.f # B#f()

かといって、C++が同じことができないわけでありません。virtualを付ければ、オブジェクト自体にメッセージを送った場合と同じことが可能です。

C++

1#include <iostream> 2using namespace std; 3struct A { 4 virtual void f() { cout << "A#f()" << endl; } 5}; 6struct B : public A { 7 virtual void f() { cout << "B#f()" << endl; } 8}; 9int main() { 10 auto x = new B(); 11 A *a = x; 12 B *b = x; 13 a->f(); // B#f() 14 b->f(); // B#f() 15}

C++のオブジェクト指向の流れを組むJavaでは全てのメソッドについてC++でいうvirtualが付いているのと同じ動作になるようにしました。これによって、内部構造がC++風であっても、メソッド呼び出しはオブジェクトにメッセージを送ることほぼ同じとみなしてもよくなりました。C++を除き、その由来にもかかわらず、ほとんどのオブジェクト指向言語はメソッド呼び出しをメッセージの送信と考えてもさほど大きな問題はでないと考えられます。最近の言語は特にその傾向が高いです(違いが完全になくなったわけではありません)。

なお、Pythonはもっと別の仕組みで、

Python

1a.f(x) 2a.__class__.f(a, x) 3a.__class__.__dict__['f'](a, x)

がほぼ同じになります(継承があるとちょっと違いますが)。ですが、オブジェクトにメッセージを送ると考えても、こちらも問題はあまりありません。

投稿2018/10/06 06:09

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/10/08 01:59

ご回答ありがとうございます。 C++が若干特殊なだけで、ほとんどの言語では メソッド = メッセージと捉えることが可能。 なるほど。
guest

0

今どきの大抵の言語では、メッセージ=メソッド呼び出しという理解で良いと思います。

例外はあります(Smalltalkとか)。

オブジェクト指向における「メッセージ」とは何か - t-hom’s diary
意味が分かる「オブジェクト指向」入門2 ――「メッセージの意味は何か?」

投稿2018/10/06 03:27

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/10/06 10:41

> 例外はあります(Smalltalkとか)。 こっちが本家ですね。
hayataka2049

2018/10/06 11:30 編集

Simulaあたりが本家でC++もその正当な子であり、むしろメッセージを重視するSmalltalkが異端と理解しています
pepperleaf

2018/10/07 01:11

Simulaって名前、久々。もっともメッセージって言っている時点で、Smalltalkから、て認めてる感じ。 (ちょっと Sumula、調べてみようか)
BeatStar

2018/10/08 02:04

ご回答ありがとうございます。 >> 今どきの大抵の言語では、メッセージ=メソッド呼び出しという理解... やはりそうなんですね!
guest

0

RPCによって見た目は単なるメソッド呼び出しなのに
実際にはプロセスやネットワークを跨いでいることもあったりするので、
メッセージと理解しておいたほうが頭が柔軟になって良さそうな気がしてます。

Smalltalkのメッセージ式に近いのがObjective-Cですね。実行時にシグネチャの検索をしたりするからかなりメッセージっぽい。

投稿2018/10/06 10:21

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/10/08 01:56

ご回答ありがとうございます。 >> 実際にはプロセスやネットワークを跨いでいることもあったりする あー、そういう場面ありそうですね... やはり メソッド = メッセージだったんですね
guest

0

オブジェクト指向はプログラミングのパラダイムのひとつです。 やりたいことをプログラムに落とし込むにあたってどうモデル化するかという一種の考え方に過ぎず、言語が C であろうと HSP であろうとオブジェクト指向的にプログラムを構成すればそれはオブジェクト指向です。

いわゆるオブジェクト指向言語というのはオブジェクト指向の考え方を表現しやすい機能を豊富に揃えているということであり、メンバ関数もまたメッセージ (らしきもの) の実現方法のひとつです。 しかし、メンバ関数の呼び出しは関数の呼び出しでしかなく、それをメッセージとして使うかどうかはあなた次第です。 言語仕様上はメンバ関数の呼び出しがメッセージの送信であるなどとは述べていません。

逆に、クラスをただの名前空間の機能のみとして使うようなことも出来ますし、それはメンバ関数を呼び出していても明らかにメッセージとしての利用ではありません。 (もうずいぶん前のことになってしまいましたが、いわゆる「staticおじさん」がやっていたのがこれですね。)

要するに、「概念」と「それの実現方法」を区別して考えてください。 メッセージは (オブジェクト指向における) 概念で、それのひとつの実現方法としてメンバ関数という方法が提供されています。 C との折り合いや、その他の言語設計の都合もあって必ずしも本来のオブジェクト指向の理念通りではないかもしれませんが、メッセージを関数で表すのもひとつの現実的な解のひとつなのです。

投稿2018/10/06 06:01

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2018/10/08 02:00

ご回答ありがとうございます。 >> 要するに、「概念」と「それの実現方法」を区別して考えてください。 ですね。
guest

0

皆様、ご協力ありがとうございます。
(ベストアンサーを誰にするか)かなり悩みました(しっくりくる回答ばかりなので...)が、
raccyさんの「C++で表現した場合、どのようになるか」を提示されたので、
もうちょっと考えてみたいという考えに至ったのでraccyさんをベストアンサーとさせて頂きます。
有難うございました!

投稿2018/10/08 02:08

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問