ポリモーフィズムとは?
解決済
回答 5
投稿
- 評価
- クリップ 2
- VIEW 3,378
ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念
オーバーライド、オーバーロードはその具体的な方法。
ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある、ということでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+5
家を建てる現場で、監督が大工、左官屋、配管工にそれぞれ個別の命令を出さなくても、「働け」という命令をすればそれぞれの仕事をするよ、すなわち、同じメソッド(この場合は「働け」)を呼び出しても、それぞれ対応した動きをするよ、というのがポリモーフィズムです。
オーバーライドは、大工にはもともと「釘を打て」という命令をすると玄能で釘を打つ、という機能があるとして、ある大工は普通の大工の機能はすべて持っているけれど、「釘を打て」という命令に対しては釘打機で高速に処理する、みたいな感じで、基底のクラスを継承したクラスで、元のクラスのメソッドを上書きすることです。逆に言うと、継承したクラスで特にオーバーライドしていないメソッドは継承元のクラスのメソッドがそのまま使われるということです。
オーバーロードは、ある一つのメソッド名に対し、引数の数や型を違うものは違うメソッドとして扱われるというものです。大工に「働け」という際に釘と玄能を渡すと釘を打つし、カンナを渡すと木を削る、という感じでしょうか。
質問に答えていなかったので追記です。
ポリモーフィズムというのは、「同じメソッドにいろんな処理を持たせよう!」というよりは、それぞれのオブジェクトに対して同じメソッドを呼んでもオブジェクトってそれぞれさまざまなんだからそのオブジェクトに適したそれぞれの動きをするよね、という意味で「同じメソッドでもオブジェクトごとに違う処理が行われるようなオブジェクトで構成されている」という状態のことです。
オーバーライドはそういう状態を作り出す機構の一つではあると思います。
オーバーロードについては、通常のオブジェクトの場合にはポリモーフィズムとは違う気がしますが、演算子のオーバーロードとかはポリモーフィズムっぽいですね。
そのような機構がなくとも、あるいはあってもそれに乗らずに duck typing してても、それはポリモーフィズムと言えると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
その概念を具体的に実現する手段にそういう名前がついている
と考える方が分かり易い気がしますけどどうでしょうかね?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
様々な回答が先に出ておりますが、質問者様の質問自体が質問に対する答えだと思います。
ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念
オーバーライド、オーバーロードはその具体的な方法。
ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある
おそらく質問者様はご自分の考えに確信が得たいということですよね?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
コードで語ります。
実行はこちらから・・・https://paiza.io/projects/neErBydmHr86NXa33WCKlg
import java.io.BufferedReader;
import java.io.InputStreamReader;
//https://teratail.com/questions/29940
class A{
void print(){
System.out.println("A.print!");
}
//OverLoad
void print(String s){
System.out.println(s);
}
}
class B extends A{
//OverRide
void print(){
System.out.println("B.Print!");
}
}
public class Main {
public static void main(String[] args) throws Exception {
A a = new A();
a.print(); // A.print!
a.print("OverLoad!"); // OverLoad!
//Polymorphism
A b = new B();
b.print(); // B.Print!
b.print("Polymorphism!"); // Polymorphism
}
}
同じメソッド名で引数違いのものをオーバーロードと呼びます。
基本的にやることは同じだけど指示の仕方を変えるときに使います。
スーバークラス(継承元のクラス)の同じ引数のメソッドを上書きして書き換えることを
オーバーライドと呼びます。
もの(クラス)が違うのでやり方が変わってくるときに使います。
ポリモーフィズムは違う方だけど、同じ呼び出し方ができるので同じクラスとみなしても良い場合に
使います。Javaでは、どのクラスとみなすことが出来るか厳密に定義する必要がありますが、
継承関係がある場合は不要です。(厳密な宣言はインターフェイスというものをつかいます。)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ポリモーフィズムは下記のようなコードで発揮できます。
List<Item> items = new ArrayList<Item>();
items.add(new (Circle());
items.add(new (Rect());
items.add(new (Elipse());
for (Item item : items) {
// 図形を描画
item.draw();
}
下記2つの条件を満たすだけで、同一メソッドであるdraw()を読ん
でいるにも関わらず、複数パターンの図形を描画することができま
す。
・どの図形もItemクラスを継承している
・draw()メソッドを適切にオーバーライドしている
もしポリモーフィズムという概念が無い場合、コードは下記のように
煩雑なものになっていることでしょう。
if (描画対象が円) {
// 円を描画
drawCircle();
} else if (描画対象が四角) {
// 四角を描画
drawRect();
} else if (描画対象が楕円) {
// 楕円を描画
drawElipse();
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/16 22:39
2016/03/17 14:03
私にはまだ少し難しいようですが、何となく概要がつかめました!