この章では抽象クラスについて説明します。
抽象クラスとは親クラスで大まかなことだけを定義するクラスのことを言います(だから抽象と言う名前が付いています)。
具体的なことはその抽象クラスを引き継いだ各クラス内で決めます。
抽象クラスは親クラス名の前にが付いたクラスであり、抽象クラスの中のメソッドは名前だけ決めて(中身は何も書きません)、メソッドの内容はこれを継承したクラスに書きます。
このようなメソッドを抽象メソッドといいます。
では例をみてみましょう。 抽象クラスの基本構文は以下の通りです。 抽象クラスにしたいクラスには「abstract」を「class」の前に付けます。
さらに中身が決まっていない抽象メソッドの宣言にも「abstract」を付けます。
この例の中では以下の2行が抽象メソッドになります。 抽象メソッドが1つでも含まれているクラスは抽象クラスになります。
また、抽象クラスには普通のメソッドも記述出来ます。
つまり、抽象クラスには抽象メソッドでないメソッドも書くことができます。
抽象メソッドでない普通のメソッドは継承するクラスでもわざわざクラスごとに内容を変える必要が無いメソッドなので、普通のメソッドにしているわけです。
この例ではsleepメソッドを抽象メソッドにしないで、普通のメソッドにしていますが、「夜に寝る」は継承されたクラスで変える必要が無いので普通のメソッドにしています。
抽象メソッドのeatは動物ごとに食べるものが違うので、eatと言うメソッド名だけ決めて、後の具体的な内容は抽象クラスを継承したクラスの中で書くという形を取ります。
抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければなりません。オーバーライドしないとコンパイルエラーとなります。
ですので のように抽象メソッドの宣言をしましたら、以下のように継承したクラスで実際の具体的な内容を記述してください。 抽象メソッドを受け継いだメソッドにoverrideを付けるのを忘れないでください。また、抽象メソッドにvirtualを付ける必要はありません。 抽象クラスについて補足します。
この例の場合 Animalクラスを継承してCatsクラスやDogクラスを定義していますが、この他にもTigerクラスなど他にもクラスが増える可能性もあります。
このように拡張する可能性があるのでAnimalクラスですべてメソッドの中身などを決める必要はないわけです。
つまり、それぞれ動物には特色があるのでAnimalクラスですべての具体的な動きなどを決められないわけです。
Animalクラスで抽象的な名前だけ決めて、後の具体的なことは継承したクラスに任せるとした方が大きいプログラムの場合には使い勝手が良くなります。
他の例を挙げますが、ゲームのプログラムを作るとします。
その時に魔法メソッドを抽象メソッドにして、具体的な魔法の動きは抽象クラスを受け継いだクラスに書くという使い方も出来ます。
結果は以下の通りです。
タグ: 抽象クラス
抽象クラスについて知ろう
この章では抽象クラスについて説明します。
今までのクラスを使ったプログラムではクラスのデータメンバやメンバ関数の内容を初めからきっちり決めて目的のプログラムを作成してきましたが、抽象クラスは文字通り抽象的な親クラスを作って、子クラスで具体的なプログラムを行っていきます。
抽象クラスで宣言をした関数は必ず子クラスで定義を書かなくてはいけないので(定義を書かないとエラー)、メンバ関数の入れ忘れなども防ぐことが出来ます。 親クラスのgetPoint関数は関数の宣言だけをして、子クラスで関数の内容を具体的に定義しています。 つまり、親クラスのメンバ関数は、宣言だけで中身がなく、関数の具体的な処理の記述は子クラスに任せると言うことです。
ですので、親クラスで純粋仮想関数を宣言すると子クラスではと宣言すると共に具体的な中身を書かなくてはいけません。 この例では以下の部分が純粋仮想関数の具体的な中身を記述した箇所です。 その場合には以下の子クラスの宣言の中でも関数の宣言を行うことが必要です。 そして、それぞれの宣言をした関数の中身を子クラスで書いていくことになります。
抽象クラスについて知ろう
この章では抽象クラスについて説明します。
抽象クラスとは親クラスには大まかなことだけを定義しておいて、具体的なことは継承した各クラス内で決めると言う仕組みの事です。
抽象クラスは親クラスの宣言にが付いたクラスであり、抽象クラスの中のメソッドには名前だけ決めて、中身は何も書きません。そして、メソッドの内容は抽象クラスを継承したクラスに書きます。このようなメソッドを抽象メソッドといいます。
抽象メソッドは先頭にabstractと書きます。 次の例ではクラスは4つありますが、それぞれ別ファイルに保存してください。
次のファイルは「Soldier.java」です。 次のファイルは「Superman.java」です。
次のファイルは「SpiderMan.java」です。 次のファイルは「Main6.java」です。 この例ではSoldierクラスが抽象クラスになります。 抽象クラスを宣言した後は以下のようにabstractを付けて抽象メソッドを宣言しますが、抽象メソッドは中身を書きません。 また、抽象クラスには普通のメソッドも記述出来ます。
つまり、抽象メソッドでないメソッドも書くことができます。
抽象メソッドでない普通のメソッドは継承するクラスにも共通のメソッドであり、わざわざクラスごとに内容を変える必要が無い場合には普通のメソッドにしてください。
この例では寝ると言うsleepメソッドを抽象メソッドにしないで、普通のメソッドにしています。
抽象メソッドは例えばeatメソッドではSoldierごとに食べるものが違うので、eatと言う名前だけ決めて、後の具体的な内容は抽象クラスを継承したクラスのeatメソッドに任せるという形を取ります。
つまり、抽象クラスを作った時点では具体的なメソッドの中身を決める必要が無いわけです。
runやeatなど必要な機能だけを抽象クラスでは決めることになります。
抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければなりません。
オーバーライドしないとコンパイルエラーとなります。
ですので のように抽象メソッドの宣言をしたのならば次のように抽象クラスを継承したクラス内で実際の具体的な内容を記述してください。 つまり以下のように書くとエラーになります。 結果は以下の通りです。