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

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

ただいまの
回答率

90.34%

  • オブジェクト指向

    298questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

  • オブジェクト

    95questions

    オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

「多態性」と「抽象クラス」は同じ意味ということですが、なぜ一緒じゃないんですか?

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 1,171

mr0237

score 143

JAVAを勉強している者です。説明が下手ですいませんが、この質問に 

これって、派生させてクラスに異なる動作をさせる【多態性】とはどう違うんですか?

の回答に

同じです。先のドライバーの例で説明すると、「グリップを握って回す」という行為は同じでも、付けた先端の種類によって、あるときはプラスねじ回しになり、あるときはマイナスねじ回しになる、というように機能が変えられることを多態性(ポリモーフィズム)といいます。 

とか

ある意味、同じものです。 
「派生させてクラスに異なる動作をさせる【多態性】」を実装する時、基底クラスに「抽象クラス」を用いることがあるという関係なのです。 

書かれているんですが、「多態性」と「抽象クラス」が同じ意味なら、なぜ「多態性」と「抽象クラスがあるんですか?

厳密には何がどう違うのでしょうか?
わかりやすいような例や例えで教えてくれませんか?   
できれば身近な例を挙げて教えてくれませんか?   
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+9

目的と手段を混同していませんか?
多態性は目的で、抽象クラスは手段です。
抽象クラスを使うことで多態性を実現しています。

ドライバーというネジを締めるというメソッドを持つ抽象クラスを作り。
それを継承するプラスドライバーやマイナスドライバーの具象クラスを作成する。
こうすることで、これらのクラスを利用するクラスはネジを締めるというメソッドに対して、プラスネジやマイナスネジを締める多態性を得ることになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+6

多態性と抽象クラスは別です。
多態性を実現するために抽象クラスを利用する、というコードが書かれることが多いので2つは深く関連した単語であることは確かですが。

多態性は、
同じ名前のメソッドを呼び出した時に、実行される処理がインスタンスの種類によって変わる
という機能を指す言葉です。

抽象クラスは、
継承元として利用することを目的としたクラスであり、インスタンスを作成できない
というクラスの性質を指す言葉です。

「身近な例」という喩え話では分かった気にはなってもきちんと理解できないと思うので、実際に多態性や抽象クラスを利用した簡単なコードをご自身で書いてみることをお勧めします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

国語の問題と、プログラミング経験の問題のように思えます。

 国語の問題

用語の意味と、身近な例

  • 多態性をもつクラスを作るときには、抽象クラスを使用します。
  • 保温性をもつ衣類を作るときには、毛糸を使用します。

 プログラミング経験の問題

オブジェクト指向に関する用語は、読むだけで理解するのは難しいです。
実際に、Javaを使って、
クラスの継承、抽象クラスの継承、多態性(ポリモーフィズム)を試してみてください。
どんなプログラムを組めばよいか思いつかない場合は、
Javaの入門書のサンプルコードを書き写しながら考えてみるとよいです。

プログラミングは書いてナンボですよ!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

これだけじゃ、確かにわかりづらいかも...

抽象クラスっていうのは、abstract を使っているクラスのこと。

多様性は 英語だと Polymorphism ( ポリモーフィズム ) です。

特に親クラス型 ( またはインターフェース型 )として受け取った場合のイメージでしょうか。

普通は、

クラス名 オブジェクト名 = new クラス名();

となりますが、

TestA を継承し、TestA1, TestA2, TestA3 を定義した場合は、

TestA obj = new TestA1();

みたいにすることも可能です。

たとえば、

ユーザ入力の値によって生成するオブジェクトを変えるとします。

1 なら TestA1 の、2 なら TestA2 の... という具合に。

その場合、すべて最初から生成するという方法もありますが、

その分メモリを食うので、不要なオブジェクトは作らないとします。

そうすると、

// もし 1 なら
obj = new TestA1();

// もし 2 なら
obj = new TestA2();

みたいにしようとします。

JavaScriptやVBA 等のように、型があって無いような言語ならいいですが、

Java, C#, C/C++ は型が厳格です。

なので、型を決める必要がありますね。

なので、

親クラスの Testクラスを受け皿として、

Test obj = new TestA1();

のようにします。

たとえば、

// int a にユーザ入力の値が入っているとして

Test obj;

if( a == 1 ){
           obj = new TestA1();
}else if( a == 2 ){
           obj = new TestA2();
}else ...

という感じに。

で、親クラス ( 抽象クラス ) である Testクラス にある メソッドを使うことができます。

もし子クラスで再定義されているならそれを...という感じで。

ひとつのメソッドでも、そのオブジェクトがどのクラスから生成されたかによって

変化します。

これのことだと思いますよ?

間違っていたらすみません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

抽象クラスを含む継承は、差分プログラミングが目的で、必ずしも多態を使う目的でなくても使います。
つまり、派生クラスの型ととして使うのが目的の場合も多いです。

多態は、superクラス(親クラス)やインターフェイスのクラスとして、使うことなので使い方の話です。

継承 → 作り方の話
多態 → 使い方の話
ですね。(一人で納得)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • オブジェクト指向

    298questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

  • オブジェクト

    95questions

    オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。