この章では抽象クラスについて説明します。
抽象クラスとは親クラスで大まかなことだけを定義するクラスのことを言います(だから抽象と言う名前が付いています)。
具体的なことはその抽象クラスを引き継いだ各クラス内で決めます。
抽象クラスは親クラス名の前に
このようなメソッドを抽象メソッドといいます。
では例をみてみましょう。
さらに中身が決まっていない抽象メソッドの宣言にも「abstract」を付けます。
この例の中では以下の2行が抽象メソッドになります。
また、抽象クラスには普通のメソッドも記述出来ます。
つまり、抽象クラスには抽象メソッドでないメソッドも書くことができます。
抽象メソッドでない普通のメソッドは継承するクラスでもわざわざクラスごとに内容を変える必要が無いメソッドなので、普通のメソッドにしているわけです。
この例ではsleepメソッドを抽象メソッドにしないで、普通のメソッドにしていますが、「夜に寝る」は継承されたクラスで変える必要が無いので普通のメソッドにしています。
抽象メソッドのeatは動物ごとに食べるものが違うので、eatと言うメソッド名だけ決めて、後の具体的な内容は抽象クラスを継承したクラスの中で書くという形を取ります。
抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければなりません。オーバーライドしないとコンパイルエラーとなります。
ですので
この例の場合 Animalクラスを継承してCatsクラスやDogクラスを定義していますが、この他にもTigerクラスなど他にもクラスが増える可能性もあります。
このように拡張する可能性があるのでAnimalクラスですべてメソッドの中身などを決める必要はないわけです。
つまり、それぞれ動物には特色があるのでAnimalクラスですべての具体的な動きなどを決められないわけです。
Animalクラスで抽象的な名前だけ決めて、後の具体的なことは継承したクラスに任せるとした方が大きいプログラムの場合には使い勝手が良くなります。
他の例を挙げますが、ゲームのプログラムを作るとします。
その時に魔法メソッドを抽象メソッドにして、具体的な魔法の動きは抽象クラスを受け継いだクラスに書くという使い方も出来ます。
結果は以下の通りです。