No.13ベストアンサー
- 回答日時:
正解だけ先に言っておきましょう。
オブジェクト指向での定義は「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。
上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、
>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)
> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。
> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。
オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。
オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!
と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。
ご返答ありがとうございます。
うーん、文脈で意味する所が変わってしまうのか…
単純な事かと思っていましたが、
意外と複雑な事だったようで。
皆様方のご意見とても為になりました。
No.14
- 回答日時:
ちなみに、メソッドの実装は、必ずしも関数コールである必要はありません。
C++ や Java の実装がそうなっているというだけの話で、それ以外の実装になっている言語もあるでしょう。
# 実装レベルの話は、C++ と Java の話しか知らないものでして。。。
# たとえば、Smalltalk とか Objective-C とか Ruby なんて言語は
# どうなんでしょうか。
…と、なんだか結局のところ、jacta さんと同じことを繰り返してるような気がしてきました。。。
# No5 あたりで。
No.12
- 回答日時:
No11 ency です。
ちょっと補足しておきます。
オブジェクト指向は、あるクラスのインスタンスを必要なときに動的に生成できるわけで、その各インスタンスに対して個別に何か処理をさせるのがメソッドなわけで。。。
ただ、実は C でも似たようなことは普通にやっているわけで。。。
------------------------------------------------
#define SIZE 10
FILE *fp1, *fp2;
char buf[SIZE];
fp1 = fopen( "hoge1.txt", "r" );
fp2 = fopen( "hoge2.txt", "r" );
fgets( buf, SIZE, fp1 );
fgets( buf, SIZE, fp2 );
------------------------------------------------
たとえば、これをこんなふうに書替えれば、なんとなくオブジェクト指向っぽくなりませんかねぇ?
(注)こんな言語はありません。
------------------------------------------------
#define SIZE 10
FILE *fp1, *fp2;
char buf[SIZE];
fp1 = new FILE( "hoge1.txt", "r" );
fp2 = new FILE( "hoge2.txt", "r" );
fp1.fgets( buf, SIZE );
fp2.fgets( buf, SIZE );
------------------------------------------------
ま、fopen() が new FILE になってオブジェクト生成っぽくなっているところは置いといて、その下。。。
最後の引数を、関数の前にもっていって変数と関数をドットでつないだだけ。。。
ま、メソッドなんて、乱暴な言い方をすればこんなものです。
あ、でも、これがすべてだと思わないでくださいね。
今後のオブジェクト指向の勉強にさしさわりがありますので。。。
あくまで、導入部分のイメージとしてとらえてください。
# しかも実装ベースの話なので、オブジェクト指向の本来の考え方とは
# 違う部分もありますし。。。
# オブジェクト指向は、こんな実装ベースの話からスタートしているのではなく、
# もっと上位の概念というか、抽象的なところからスタートしている話です。
# ですので、メソッドと関数も、考えているレベルというかレイヤというかが
# 違っているわけですね。
# 外部設計レベルの話がメソッドであるとするならば、それに対する実装を
# 設計する内部設計レベルの話が関数ということになりますかねぇ。。。
# だから、本来、同じとか違うとかいうような比較は、あまり意味がないのかも
# しれません。
それにしても、こう考えると、メソッドを関数コールで実装している言語がある理由もなんとなくわかりませんか?
No.11
- 回答日時:
関数とメソッド、参照とポインタ…議論が平行線になる話題ですね。
私の理解としては「メソッドの実装として関数コールで機能を実現している言語がある」というところですね。
C++ では、メソッド相当の機能を「メンバ関数」と呼んでいるだけだと思っています。
Java のメソッドも、内部では関数コールで実現しているだけだと思いましたが違いましたっけ?
ま、このせいで C++ や Java は純正オブジェクト指向として認めない人たちもいると聞いたことがあります。
で、私の結論としましては次のとおりです。
1. メソッドはオブジェクトに対するメッセージ送信に対する応答。
2. メソッドの実装方法の一つとして関数コールで実現している言語がある。
もっと乱暴な言い方をすれば、「メソッド=関数」という理解でとりあえずは良いのではないでしょうか。
特に C からオブジェクト指向に移行する人たちは、まずはこの理解で良いと思います。
結局「なんだ、メソッドって関数コールじゃん!」っていう結論になることが多いようです。
# 「メッセージを送信して…」などという言葉があると、「スレッドが変わるのか?」
# などという誤解をする人たちもいるようなので。。。
No.10
- 回答日時:
> 元々メソッド(method)というコトバはSmalltalkで用いられたものではなかったかしら。
歴史的経緯はどうであれ、SmalltalkでもJavaでもC#でも、そこで使われている「メソッド」はC/C++から見れば他言語の概念に過ぎません。
#7 の回答のように、その言葉を使っている人と、今自分が扱っているものから判断するしかないと思います。
実際、FA機器を扱ったりしていると、顧客が使う「メソッド」は生産手法のことだったりするわけで、そこで開発するアプリケーションでもやはり「メソッド=生産手法」になるわけです。
というわけで、C/C++とは直接関係のない用語の定義を一意に定めることはできないと思います。
No.8
- 回答日時:
> だとすると、C#におけるメソッドはどうなんでしょう。
ただのメンバ関数をメソッドと'称している'に過ぎないように思えますが。これはその通りだと思います。
C++の「オブジェクト」というのも、オブジェクト指向でいうところの「オブジェクト」と必ずしも等価でないのと同様、C#における「メソッド」もその言語内のローカルな定義に過ぎないのでしょう。
No.7
- 回答日時:
色々な回答があり情報が錯綜していますが。
。。「関数=メソッド」と考えていいと思います。まずC++の言語仕様には「メソッド」はないと思います(私自身仕様を把握しているわけではないので自信はありません、ないと思います)。
そのためC++(の仕様)において「メソッドと関数の違いは?」という質問への正確な回答はないと思います。
とは言うもののC++に関しても様々な場面で「メソッド」という言葉が使われています。
Visual C++で「メソッド」という言葉が使われている場面もあります。COM(ActiveX)で外部から操作できる関数を「メソッド」と呼びます(同じように外部から参照や操作できる変数は"プロパティ"と呼びます)。これはマイクロソフトなどが使っているC++での「メソッド」という言葉です。
またC++以外の言語を使っていて新しくC++を始めた人などは「メソッド=関数」という意味合いで使っていることもあります。また「クラスのメンバー関数=メソッド」として扱っている人もいます。これらは多くの場合上で述べたマイクロソフトの"メソッド"という言葉とは違う意味で使っています。
つまり「メソッド」という言葉はきちんとした定義がない(?)ためにその言葉を使っている人によって意味合いが違っています。「メソッド」という言葉に出会ったらその時々でその意味を判断する必要があると思います。しかしどの場合にも"メソッド"が"関数"の1種であることには変わりはないので「メソッド=関数」と考えていいと思います。
ご返答ありがとうございます。
私としてはクラスのメンバ関数がメソッドの事で、
メンバ関数と言う言い回しは、C/C++の方言だと考えていたのですが、
改めて調べ直すと、他の方々のご返答のように、
人によってまちまちなので、何が正しいのか確信がもてなくなりました。
多くの方々から、ご返答を頂けましてありがたいのですが、
結局のところ、どなたのご意見が正しいのでしょうか。
No.6
- 回答日時:
#5> 「標準出力というオブジェクトに、putsというメッセージを送ると、文字列が出力されるというメソッドが実行される」といった具合に、メンバ関数とは直結しません。
なるほど、「オブジェクトに送られたメッセージに対する反応」がメソッドで、その実現手段の一つがメンバ関数だと(それでいいですか?)。
だとすると、C#におけるメソッドはどうなんでしょう。ただのメンバ関数をメソッドと'称している'に過ぎないように思えますが。
No.5
- 回答日時:
> ? では メソッド と メンバ関数 の違いは?
C/C++では、メソッドは言語仕様にないので一般的な解釈をせざるを得ないと思います。
「標準出力というオブジェクトに、putsというメッセージを送ると、文字列が出力されるというメソッドが実行される」といった具合に、メンバ関数とは直結しません。
もっと極端な例では、「タイマというオブジェクトに、レジスタへの書き込みというメッセージを送ることで、カウントアップ開始というメソッドが(ハード的に)実行される」というのもあるでしょう。
メンバ関数はメソッドを実現する上で便利な機能ではありますが、メンバ関数を使えばメソッドになるわけでもなければ、メソッドはメンバ関数でしか実現できないものではないと思いますが、いかがでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- PHP ここで言う「アロー演算子」の役割を教えてください。 1 2022/03/26 02:38
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日本の教育って時間が無い中で...
-
エクセルVBAで、条件に一致する...
-
コマンドプロンプト実行後に画...
-
DataGridViewの行追加について。
-
現在、ASP.NET(言語:VB.NET)...
-
System.load() と System.loa...
-
Refreshメソッドの使い方
-
タグチメソッドと実験計画法の違い
-
JAVAによるDB接続(JDBC)
-
AdapterView<?> parent この部...
-
【sendkeysメソッドが動かずに...
-
C#の動的キャスト
-
drawStringで文字間隔の調整
-
エクセルVBAにおけるON TIMEメ...
-
関数とメソッドの違い
-
ExcelVBAのプログラムをJavaへ変換
-
VBA コピーが出来ません…!
-
final修飾子を使っているのに、...
-
「初心者です」-Xlint: depreca...
-
vbaエクセルマクロ RemoveDupli...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
final修飾子を使っているのに、...
-
JSPで<SELECT>の中にDBから持っ...
-
Labelコントロールに数字を代入...
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
DataGridViewでセルクリックイ...
-
VBPをダブルクリックするとたま...
-
onClickで関数呼出し後に、結果...
-
コマンドプロンプト実行後に画...
-
配列のメソッド
-
日本の教育って時間が無い中で...
-
Refreshメソッドの使い方
-
mainメソッドのthrows節で設定...
-
【sendkeysメソッドが動かずに...
-
C# 演算 最大値 最小値 表現の仕方
-
VBA コピーが出来ません…!
-
Application.Wait の参照設定
-
ウィンドウを最前面にできません
-
for文(拡張)内の変数(ローカ...
おすすめ情報