【文法編】抽象クラス(準備)
・以前作成した mini133.cs を用いる
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
class Slime { //スライムクラスの定義(mini133クラスが利用する部品クラス)
public int hp; //HP
public string name; //名前
public virtual void show() { //名前とHPを出力するメソッド(オーバーライド可)
Debug.Log("名前:" + name + ",HP:" + hp);
}
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
// public int hp; //HPが継承される
// public string name; //名前が継承される
// public void show() { //名前とHPを出力するメソッドが継承される
// Debug.Log("名前:" + name + ",HP:" + hp);
// }
public int mp; //MPを追加
public override void show() { //名前とHPとMPを出力するメソッドにしてオーバーライド
Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
}
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
void Start() { //Unityシステムから開始時に呼び出されるメソッド
Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
Rimuru.hp = 100; //HPをセット
Rimuru.name = "リムル"; //名前をセット
Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ
HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
Hoimin.hp = 10; //HPをセット
Hoimin.mp = 500; //HPをセット
Hoimin.name = "ホイミン"; //名前をセット
Hoimin.show(); //名前とHPとMPを出力するメソッドを呼ぶ
Slime[] slimes = { Rimuru, Hoimin }; //スライムの配列に格納する
slimes[0].show(); //[0]であるRimuruの名前とHPを表示
slimes[1].show(); //[1]であるHoiminの名前とHPを表示
}
void Update() {
}
}
【文法編】抽象クラス
・多くのクラスの基本クラスとなるクラスを設計すると「具体的なことは派生クラスで決める」場合が増える
・また「車」や「家」では実体が作れないように、基本クラスはインスタンスの生成には向かなくなる
・このような場合、基本クラスを抽象クラスとして作っておけば良い
・書式: abstract class クラス名 {…}
アレンジ演習:mini133.cs
・Slimeクラスの基本クラスとして、Monsterという抽象クラスを定義しよう
作成例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
abstract class Monsters { } //【追加】抽象クラスであるモンスタークラス
class Slime : Monsters { //【変更】スライムクラスの定義(モンスターを継承)
public int hp; //HP
public string name; //名前
public virtual void show() { //名前とHPを出力するメソッド(オーバーライド可)
Debug.Log("名前:" + name + ",HP:" + hp);
}
}
class HoimiSlime : Slime { //ホイミスライムクラスの定義(スライムを継承)
// public int hp; //HPが継承される
// public string name; //名前が継承される
// public void show() { //名前とHPを出力するメソッドが継承される
// Debug.Log("名前:" + name + ",HP:" + hp);
// }
public int mp; //MPを追加
public override void show() { //名前とHPとMPを出力するメソッドにしてオーバーライド
Debug.Log("名前:" + name + ",HP:" + hp + ",MP:" + mp);
}
}
public class mini133 : MonoBehaviour { //Unityでの実行用クラス
void Start() { //Unityシステムから開始時に呼び出されるメソッド
Slime Rimuru = new Slime(); //スライムクラスからオブジェクトを生成
Rimuru.hp = 100; //HPをセット
Rimuru.name = "リムル"; //名前をセット
Rimuru.show(); //名前とHPを出力するメソッドを呼ぶ
HoimiSlime Hoimin = new HoimiSlime(); //ホイミスライムクラスからオブジェクトを生成
Hoimin.hp = 10; //HPをセット
Hoimin.mp = 500; //HPをセット
Hoimin.name = "ホイミン"; //名前をセット
Hoimin.show(); //名前とHPとMPを出力するメソッドを呼ぶ
Slime[] slimes = { Rimuru, Hoimin }; //スライムの配列に格納する
slimes[0].show(); //[0]であるRimuruの名前とHPを表示
slimes[1].show(); //[1]であるHoiminの名前とHPを表示
}
void Update() {
}
}
【文法編】抽象クラスの抽象メソッド
・抽象クラスには名前だけのメソッドを定義できる ・これにより「わが一族であれば、このメソッドを持つべきだ」というルールを設定して、派生クラスに守らせることができる ・また、派生クラスを利用する側も「この抽象クラスの派生クラスだから、このメソッドがあるはず」と理解できる ・例: Monstersクラスの一族はshowメソッドを持つこと ・書式: public abstract 戻り値型 メソッド名(引数リスト); //中カッコの代わりにセミコロン
提出:アレンジ演習:mini133.cs
・Monstersクラスに抽象メソッドpublic abstract void show(); を追記しよう ・Slimeクラスではこのメソッドをオーバーライドしよう