はじめに
java初心者が備忘録的に書いています
抽象クラスの考え方
今回は抽象クラスの継承についてまとめていく。
そもそも抽象クラスとはその名の通り抽象的なクラスである。具体例でイメージしてみる。
RPGゲーム作成で敵モンスターであるスライムクラスを作成する。フィールド変数にはHPとMPがあり、攻撃用のメソッドがある。さらに別でゴブリンクラスを作成する。同じくHPとMPをフィールド変数にもち、攻撃用クラスを持つ。
javaで書いてみると以下のようになる。
public class Slime{
int HP;
int MP;
pubric void attack(){
//hoge
}
}
public class goblin{
int HP;
int MP;
pubric void attack(){
//hoge
}
}
こうやって書いたあと中身を見てみると同じようなコードを書いていていることがわかる。
なぜならスライムもゴブリンもどちらも「モンスター」だからである。この考え方が抽象クラスの考え方。
ここでいうモンスターとは「HP」、「MP」、「攻撃用メソッド」をもつキャラクターのこととする。
java風に言い換えると親クラスに「Monster」というクラスを持つ子クラス「Slime」と「Goblin」を作成すればコーディングが楽になる。
(もう少し良い説明方法浮かばなかったものかと反省)
抽象クラスの書き方
実際に書いてみる。
public abstract class Monster{//抽象クラスはclassの前にabstractをつける
int HP;
int MP;
public abstract void attack(){
}
}
public class Slime extends Monster(){//extendsで継承
public Slime(int HP, int MP){//コンストラクタ
super.HP = HP;
super.MP = MP;
}
public void attack(){
//hoge
}
}
public class Goblin extends Monster(){//extendsで継承
public Goblin(int HP, int MP){//コンストラクタ
super.HP = HP;
super.MP = MP;
}
public void attack(){
//hoge
}
}
書き方自体はクラスの継承と変わらない
抽象クラスの特徴とメリット
抽象クラスのもっとも大きな特徴に「オブジェクトを直接生成できない」という(newできない)特徴がある。抽象クラスはあくまでも定義を行うクラスなのでnewを行おうとするとエラーがでる。
次に抽象クラスを使うメリットである。
抽象クラスを使うメリットは様々あるが、一番大きなメリットは実装の強制である。抽象クラスは、抽象メソッドを定義することができるため、サブクラスに必ず実装(これをオーバーライドという)させることができる(オーバーライドしないとエラー)。これにより実装漏れを防ぐことができる。ほかにもいろいろあるが初心者はこれくらい知っておけばいいんじゃね?(責任は取らぬ)
interface
抽象クラスの中にinterfaceというものがある。これは簡単に言うとめっちゃ抽象度が高いクラスのことをいう。
interfaceの大きな特徴は二つある。
- メソッドはすべて抽象メソッドである
- フィールドを一つも持たない
今回Monsterクラスを抽象クラスとしたがさらに抽象度の高いCharacterクラスを親クラスにつける。
implementsの書き方と継承方法は以下のように書く。最低限
public interface Character{
void walk();//public abstractは省略してもよい。理由は特徴1
}
public class Monster implements Character{//抽象クラスはclassの前にabstractをつける
int HP;
int MP;
public void attack(){}
public void walk() {}
}
後は同様にattackメソッドとwalkメソッドを実装した子クラス(Characterクラスから見たら孫クラス)を実装すればよい。
interfaceのメリット
interfaceはメソッドの処理内容を一切定義していないため通常のクラスでは許されていない多重継承が許されている。
メソッドの処理内容を一切定義していない->オーバーライドする必要があるため親クラスに同じ名前のクラスがあっても問題ないため多重継承できる。
ちなみにextendとinterfaceを同時に使うこともできるがそれはまた別の機会に、、、