オーバーロード(overloading)は多態性(polymorphism、ポリモーフィズム)と関係があるのでしょうか?
私は長い間、無関係だと思っていました。しかし、日本語圏で検索すると、オーバーロードは多態性の一種、またはそれを実現する機能、であり、関係があると考える人が多いようです。
- 多態性(多相性) (ポリモーフィズム) 多態性#1 多態性#2 [PDF]
- オーバーロードとオーバーライド、多態性と継承関係をまとめてみた|コンピューターの勉強会・研修ネタ
- 【java】オーバーロードとオーバーライドの違いとは
しかし、
oop - Is Polymorphism , Overloading and Overriding are same concepts? - Stack Overflow
で、Xavi López氏は
Method Overloading is unrelated to polymorphism. ...
メソッドオーバーロードは多態性と無関係です。...
と回答しています。リンクされている他の各質問での回答やコメントでも無関係であると考えている人が多数のようです。
英語圏が全てそうかというと、タイプが違う多態性なだけで、やはり多態性の一つであると考える人もいるようです。
Types of polymorphism in java- Runtime and Compile time polymorphism
において著者は、多態性は実行時多態性(runtime polymorhism、動的多態性、dynamic polymorphism)とコンパイル時多態性(compile time polymorhism、静的多態性、static polymorphism)の二つのタイプに分けることができるのであり、Javaのメソッドオーバーロードはコンパイル時多態性の一つであると主張しています。
私には何が正しくて間違っているかわからなくなってしまいました。オーバーロードと多態性は関係があるのか?あるとしたら、その関係は何なのか?解説をお願いします。
【補足】
ジェネリック、テンプレート、パターンマッチ、動的型付けによるダッグタイピング等とは混合しないようにお願いします。言語特有の違いがある場合は、言語を指定して説明いただきますようお願いします。
【追記】
Polymorphism (computer science) - Wikipedia によると、そもそも多態性は三種類に分かれるとなっています。
- アドホック多態性(ad hoc polymorphism)
- パラメトリック多態性(parametric polymorphism)
- サブタイプ多態性(subtype, subtype polymorphism or inclusion polymorphism)
オーバーロードはアドホック多態性に入るとされているようです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+4
オーバーロード(overloading)は多態性(polymorphism、ポリモーフィズム)と関係があるのでしょうか?
(PDF)"On Understanding Types, Data Abstraction, and Polymorphism"の原義に従うなら、「関係がある」と言って差し支えないと思います。
§1.3. Kinds of Polymorphism の Figure 1: Varieties of polymorphism. によれば、overloading は "ad-hoc polymorphism"(アドホック多相/多態)に分類されています。
私には何が正しくて間違っているかわからなくなってしまいました。
個人的な意見ですが、本件ではどれが正しくどれが間違っているという話では無く、用語の定義とそれが指し示す範囲の問題ではないでしょうか?Java言語をはじめとするオブジェクト指向言語の文脈では、subtyping(≒型の継承)とオーバーライド(override)のみが 狭義の 多態性(polymorphism) と呼ばれていると思います。
Java言語の文脈であっても多態性という用語を 広義に 捉えれば、オーバーロード(overload) による"ad-hoc polymorphism"や、ジェネリクス(generics)による"parametric polymorphism"(パラメトリック多相/多態)も含まれると考えます。
本来の"polymorphism"は、型システム(type system)の文脈で定義される用語ですし、オブジェクト指向に限定した用語でもありません。型システムの話は比較的学術よりと思いますが、(私も含めた)一般的なプログラマ/エンジニア視点では、「オブジェクト指向の文脈において型継承により実現される動的な多態性」として認知されている気がします。
なおStackOverflowのXavi López氏回答について、raccyさんが誤解釈されているように思えます。
同氏の回答中では"polymorphism"という単語がoverridingを通して実現される"subtype polymorphism"を意味しています。該当文"Method Overloading is unrelated to polymorphism"は、overloadingはその"subtype polymorphism"とは無関係である、つまりoverloadingとoverridingは別物だという自然な主張だと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
Xavi Lópezさんがいっているのは「両者は同一の概念ではないよ」というのが主張のポイントだと思います。それはそのとおりと思います。それは質問者が「ポリモーフィズムとオーバーライドとオーバーロードが全部同じもののように見える」といっている質問に対する妥当な答えであると思います。
一方ポリモーフィズムには動的なものと静的なものが考えられるという説明、および静的なものとして引数の型が異なるだけのオーバーロードを静的ポリモーフィズムとして使えるという説明を見ると「そうだなぁ」とも感じます。
要するにどちらの主張も間違ったことを言っているように感じませんでした。
オーバーロードとオーバーライドの区別がつかないような初学者にならとりあえずXavi Lópezさんのような回答を推奨すると思いますが、より広い文脈でオーバーロードがpolymorphismと無関係かどうかの議論には自分はそれほど自信はありません。ただStack Overflowの前述の質問自体は「It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form.」としてcloseされていることを考えると「文脈によって答えは違うものになることもある」ということを示唆していると自分は受け取りました。
stream.print(int)
stream.print(string)
vs
int.print(stream)
string.print(stream)
というような議論をしているなら前者はオーバーロードを後者はオーバーライドを多態性の実現に用いる設計上の選択であるというのは間違ってないように感じます。しかしオーバーロード=多態性であるとまでは思いません。以下のようなオーバーロードが「多態性を実現するためのものです」と言われたら違う気がするからです。
class.operation(string,int)
class.operation(int,string)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
同じく「静的多態性」なるものが多態性の一種と呼べるかに依存すると思います。
多態性といえば、「動的多態性」のことしか考えていませんでした。ただし、仰る通り、コンパイル時に振る舞いが決定するものも含めれば話が変わってきます。
まあ要するに言葉の解釈の違いだと思います。「マクロ関数は関数と呼べるか?」とかと同種だと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
こんにちは。
私も「ポリモーフィズム」という用語は「オーバーロード」と言う用語とは無関係なものと理解していました。
別質問の回答を見てびっくりしてググッたのですが、Wikipediaの説明を見るとオーバーロードも条件を満たすように見えました。
考えてみると、私はこれらの用語の厳密な定義を把握していません。
このように混乱していると言うことは、広く受け入れられている定義は存在しないと言うことのようです。
しかし、「専門用語」はできるだけ解釈を統一したいものです。ISOかどこかで規定されていると良いのですが。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
はい「多型」は「オーバーロード」という用語とは無関係です。
はい「多型」は「オーバーロード」という用語とは無関係です。
- https://www.welookups.com
https://javacodegeeks.net
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/12/05 18:55
多態性という言葉を使う場合は、今回わかったことに気をつけていきたいと思います。