- 締切済み
抽象メソッド、抽象クラス
C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jjon-com
- ベストアンサー率61% (1599/2592)
ANo.1をサンプルコードで書いたのがこちら。 -------- abstract class Animal { abstract void say(); } class Cat extends Animal { void say() { System.out.println("I'm a cat."); } } class Dog extends Animal { void say() { System.out.println("I'm a dog."); } } class Q7336591 { public static void main(String[] args) { Animal[] foo = new Animal[2]; foo[0] = new Cat(); foo[1] = new Dog(); foo[0].say(); foo[1].say(); } } -------- > 最初から派生クラスの方にメソッドを定義すればいいのでは そうであるなら,サブクラス側でそのメソッドを定義しても定義していなくても,どちらもjavacは正常に翻訳を終了します。 > オーバーライドしないと実装がないのでエラーになる というのが要点で,サブグラス側でそのメソッドの中身を「必ず定義しなければならない」という縛りをかけているのが抽象メソッドです。 この抽象メソッドにより,Animalに分類される者たちは全員,say()というメソッドを理解できることが保証されますから, スーパークラスであるAnimal型の変数 foo に対して say() を呼び出せば,サブクラス側CatやDogの say()実装コードが呼び出されるという,ポリモフィズム(多態性)の動きが実現できます。
- notnot
- ベストアンサー率47% (4900/10358)
Animalを抽象型、Cat と Dog をそのサブクラスとします。 say というメソッドがCatとDogでそれぞれ宣言されているとして、 Animal foo; と宣言した foo には Cat オブジェクトや Dog オブジェクトを代入できますが、Animalでsayを宣言しておくことで、fooにどちらが入ってるかによって、foo.say() でどちらかのメソッドが呼ばれます。 fooをAnimalで宣言していないと、foo に対して、foo.say() が出来ません。