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

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

新規登録して質問してみよう
ただいま回答率
86.02%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

オーバーロードは多態性と関係があるのか?

raccy
raccy

総合スコア21689

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

5回答

3グッド

7クリップ

9799閲覧

投稿2016/12/04 02:43

編集2016/12/04 03:31

オーバーロード(overloading)は多態性(polymorphism、ポリモーフィズム)と関係があるのでしょうか?

私は長い間、無関係だと思っていました。しかし、日本語圏で検索すると、オーバーロードは多態性の一種、またはそれを実現する機能、であり、関係があると考える人が多いようです。

しかし、
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)

オーバーロードはアドホック多態性に入るとされているようです。

takotakot, M-Kajiwara, KiyoshiMotoki👍を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答5

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は別物だという自然な主張だと思います。

投稿2016/12/05 01:19

編集2016/12/05 06:30
yohhoy

総合スコア6179

M-Kajiwara, raccy, maisumakun, KSwordOfHaste👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

raccy

2016/12/05 09:55

多態性と言ったときに、広義なのか狭義なのか、どの定義で言っているのかという違いだったと言うことですか…。つまり、誰も間違っていなかったと。みんな、正しかったのだと。 多態性という言葉を使う場合は、今回わかったことに気をつけていきたいと思います。

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)

投稿2016/12/04 04:04

編集2016/12/04 16:03
KSwordOfHaste

総合スコア18378

LLman, raccy, maisumakun👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2

同じく「静的多態性」なるものが多態性の一種と呼べるかに依存すると思います。

多態性といえば、「動的多態性」のことしか考えていませんでした。ただし、仰る通り、コンパイル時に振る舞いが決定するものも含めれば話が変わってきます。

まあ要するに言葉の解釈の違いだと思います。「マクロ関数は関数と呼べるか?」とかと同種だと思います。

投稿2016/12/04 03:02

HogeAnimalLover

総合スコア4823

raccy👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

こんにちは。

私も「ポリモーフィズム」という用語は「オーバーロード」と言う用語とは無関係なものと理解していました。
別質問の回答を見てびっくりしてググッたのですが、Wikipediaの説明を見るとオーバーロードも条件を満たすように見えました。

考えてみると、私はこれらの用語の厳密な定義を把握していません。
このように混乱していると言うことは、広く受け入れられている定義は存在しないと言うことのようです。
しかし、「専門用語」はできるだけ解釈を統一したいものです。ISOかどこかで規定されていると良いのですが。

投稿2016/12/04 03:43

Chironian

総合スコア23251

raccy👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

はい「多型」は「オーバーロード」という用語とは無関係です。
はい「多型」は「オーバーロード」という用語とは無関係です。

https://javacodegeeks.net

投稿2019/01/06 03:31

adityakin

総合スコア12

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。