ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念
オーバーライド、オーバーロードはその具体的な方法。
ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある、ということでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
家を建てる現場で、監督が大工、左官屋、配管工にそれぞれ個別の命令を出さなくても、「働け」という命令をすればそれぞれの仕事をするよ、すなわち、同じメソッド(この場合は「働け」)を呼び出しても、それぞれ対応した動きをするよ、というのがポリモーフィズムです。
オーバーライドは、大工にはもともと「釘を打て」という命令をすると玄能で釘を打つ、という機能があるとして、ある大工は普通の大工の機能はすべて持っているけれど、「釘を打て」という命令に対しては釘打機で高速に処理する、みたいな感じで、基底のクラスを継承したクラスで、元のクラスのメソッドを上書きすることです。逆に言うと、継承したクラスで特にオーバーライドしていないメソッドは継承元のクラスのメソッドがそのまま使われるということです。
オーバーロードは、ある一つのメソッド名に対し、引数の数や型を違うものは違うメソッドとして扱われるというものです。大工に「働け」という際に釘と玄能を渡すと釘を打つし、カンナを渡すと木を削る、という感じでしょうか。
質問に答えていなかったので追記です。
ポリモーフィズムというのは、「同じメソッドにいろんな処理を持たせよう!」というよりは、それぞれのオブジェクトに対して同じメソッドを呼んでもオブジェクトってそれぞれさまざまなんだからそのオブジェクトに適したそれぞれの動きをするよね、という意味で「同じメソッドでもオブジェクトごとに違う処理が行われるようなオブジェクトで構成されている」という状態のことです。
オーバーライドはそういう状態を作り出す機構の一つではあると思います。
オーバーロードについては、通常のオブジェクトの場合にはポリモーフィズムとは違う気がしますが、演算子のオーバーロードとかはポリモーフィズムっぽいですね。
そのような機構がなくとも、あるいはあってもそれに乗らずに duck typing してても、それはポリモーフィズムと言えると思います。
投稿2016/03/16 09:18
編集2016/03/16 13:39総合スコア2468
0
その概念を具体的に実現する手段にそういう名前がついている
と考える方が分かり易い気がしますけどどうでしょうかね?
投稿2016/03/16 09:21
総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
様々な回答が先に出ておりますが、質問者様の質問自体が質問に対する答えだと思います。
ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念
オーバーライド、オーバーロードはその具体的な方法。
ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある
おそらく質問者様はご自分の考えに確信が得たいということですよね?
投稿2016/03/16 15:09
総合スコア396
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/17 04:58
0
ポリモーフィズムは下記のようなコードで発揮できます。
java
1List<Item> items = new ArrayList<Item>(); 2 3items.add(new (Circle()); 4items.add(new (Rect()); 5items.add(new (Elipse()); 6 7for (Item item : items) { 8 // 図形を描画 9 item.draw(); 10}
下記2つの条件を満たすだけで、同一メソッドであるdraw()を読ん
でいるにも関わらず、複数パターンの図形を描画することができま
す。
・どの図形もItemクラスを継承している
・draw()メソッドを適切にオーバーライドしている
もしポリモーフィズムという概念が無い場合、コードは下記のように
煩雑なものになっていることでしょう。
java
1if (描画対象が円) { 2 // 円を描画 3 drawCircle(); 4} else if (描画対象が四角) { 5 // 四角を描画 6 drawRect(); 7} else if (描画対象が楕円) { 8 // 楕円を描画 9 drawElipse(); 10}
投稿2016/03/16 14:04
総合スコア112
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
コードで語ります。
実行はこちらから・・・https://paiza.io/projects/neErBydmHr86NXa33WCKlg
Java
1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4//https://teratail.com/questions/29940 5class A{ 6 void print(){ 7 System.out.println("A.print!"); 8 } 9 10 //OverLoad 11 void print(String s){ 12 System.out.println(s); 13 } 14} 15 16class B extends A{ 17 //OverRide 18 void print(){ 19 System.out.println("B.Print!"); 20 } 21} 22 23public class Main { 24 public static void main(String[] args) throws Exception { 25 A a = new A(); 26 a.print(); // A.print! 27 a.print("OverLoad!"); // OverLoad! 28 29 //Polymorphism 30 A b = new B(); 31 b.print(); // B.Print! 32 b.print("Polymorphism!"); // Polymorphism 33 } 34}
同じメソッド名で引数違いのものをオーバーロードと呼びます。
基本的にやることは同じだけど指示の仕方を変えるときに使います。
スーバークラス(継承元のクラス)の同じ引数のメソッドを上書きして書き換えることを
オーバーライドと呼びます。
もの(クラス)が違うのでやり方が変わってくるときに使います。
ポリモーフィズムは違う方だけど、同じ呼び出し方ができるので同じクラスとみなしても良い場合に
使います。Javaでは、どのクラスとみなすことが出来るか厳密に定義する必要がありますが、
継承関係がある場合は不要です。(厳密な宣言はインターフェイスというものをつかいます。)
投稿2016/03/16 12:47
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/16 13:39
2016/03/17 05:03