締切済み

抽象メソッド、抽象クラス

  • すぐに回答を!
  • 質問No.7336591
  • 閲覧数529
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 17% (7/40)

C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。

これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと
実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。

抽象メソッドとして実体のない定義を行う利点なるものを教えてください。
よろしくお願いします。

回答 (全2件)

  • 回答No.2

ベストアンサー率 61% (1597/2590)

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()実装コードが呼び出されるという,ポリモフィズム(多態性)の動きが実現できます。
感謝経済
  • 回答No.1

ベストアンサー率 48% (4343/8903)

Animalを抽象型、Cat と Dog をそのサブクラスとします。
say というメソッドがCatとDogでそれぞれ宣言されているとして、
Animal foo;
と宣言した foo には Cat オブジェクトや Dog オブジェクトを代入できますが、Animalでsayを宣言しておくことで、fooにどちらが入ってるかによって、foo.say() でどちらかのメソッドが呼ばれます。
fooをAnimalで宣言していないと、foo に対して、foo.say() が出来ません。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


感謝指数によるOK-チップ配布スタート!

ピックアップ

ページ先頭へ