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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

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

オブジェクト指向

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

Q&A

解決済

5回答

5502閲覧

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

mr0237

総合スコア164

オブジェクト

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

オブジェクト指向

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

0グッド

1クリップ

投稿2017/03/29 15:08

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

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

の回答に

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

とか

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

投稿2017/03/29 16:03

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

投稿2017/03/29 16:07

編集2017/03/29 16:29
ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

国語の問題

用語の意味と、身近な例

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

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

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

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

投稿2017/04/01 05:14

sutonea

総合スコア207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

抽象クラスっていうのは、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();

のようにします。

たとえば、

Java

1// int a にユーザ入力の値が入っているとして 2 3Test obj; 4 5if( a == 1 ){ 6 obj = new TestA1(); 7}else if( a == 2 ){ 8 obj = new TestA2(); 9}else ...

という感じに。

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

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

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

変化します。

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

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

投稿2017/03/30 04:31

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2017/03/30 01:27

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問