【学習kotlinシリーズ】インターフェース

Qiitaでことりん学習帳を発売しています!

インターフェースとは

インターフェースとは、「オブジェクトがどのようなメソッドを持っているか」を定義するもの。あるオブジェクトがそのインターフェースを使って定義すると、そのインターフェースに書かれているメソッドはすべて定義されていないといけない。前回に引き続き、RPGの考え方をベースにインターフェースを定義していく。

## 実際に作ってみる

コードが長くなってしまったが、書いている内容一つ一つは難しくない・・・と思う。(と書いてある解説書はだいたい難しい気もしている)

interface RPG {

    // 回復する
    fun cure()

    // 宿屋に泊まる
    fun inn()

    // 攻撃する
    fun attack(that: RPG)
    // 魔法を使う
    fun magic(that: RPG)

    // 現在のHPを取得する
    fun getHP(): Int
    // 現在のMPを取得する
    fun getMP(): Int
    // 最大HPを取得する
    fun getMaxHP(): Int
    // 最大MPを取得する
    fun getMaxMP(): Int

    // 現在のHPを変更する
    fun setHP(hp: Int)
    // 現在のMPを変更する
    fun setMP(mp: Int)

}

// RPGオブジェクトを作成する関数
fun createRPG(max_hp: Int = 100, max_mp: Int = 10): RPG = object : RPG {

    var _hp: Int = max_hp
    var _mp: Int = max_mp

    // 回復する
    override fun cure() {
        val hp = getHP() + 20
        val mp = getMP() - 2
        setHP(hp)
        setMP(mp)

    }

    // 宿屋に泊まる
    override fun inn(){
        val hp = getMaxHP()
        val mp = getMaxMP()
        setHP(hp)
        setMP(mp)
    }

    // 相手に攻撃する
    override fun attack(that: RPG){
        // 現在の相手のダメージから5を引いたHPをセットする
        val thatHP = that.getHP() - 5
        that.setHP(thatHP)
    }

    // 相手に魔法をかける
    override fun magic(that: RPG){
        // 現在の相手のダメージから20引いたHPをセットする
        val thatHP = that.getHP() - 20
        that.setHP(thatHP)

        // 現在の自分のMPから3引いたMPをセットする
        val mp = getMP() - 3
        setMP(mp)
    }


    // 現在のHPを取得する
    override fun getHP(): Int = _hp
    // 現在のMPを取得する
    override fun getMP(): Int = _mp
    // 最大HPを取得する
    override fun getMaxHP(): Int = max_hp
    // 最大MPを取得する
    override fun getMaxMP(): Int = max_mp

    // 現在のHPを変更する
    override fun setHP(hp:Int){
        _hp = hp
    }

    // 現在のMPを変更する
    override fun setMP(mp:Int){
        _mp = mp
    }

}


fun main(args: Array<String>){

    val hero: RPG = createRPG(max_hp=100, max_mp=20)
    val monster: RPG = createRPG(max_hp=120, max_mp=10)

    // 現在のmonsterのHPを表示する
    print("現在のモンスターのHP: ")
    println(monster.getHP())

    // heroがmonsterに攻撃した!
    println("勇者は攻撃した!")
    hero.attack(monster)

    // 現在のmonsterのHPを表示する
    print("現在のモンスターのHP: ")
    println(monster.getHP())

    println("----------------")
    // 現在のheroのMPを表示する
    print("現在の勇者のHP: ")
    println(hero.getHP())

    // モンスターは勇者に魔法を使った!
    print("現在のモンスターのMP: ")
    println(monster.getMP())

    println("モンスターは魔法を使った!")
    monster.magic(hero)
    print("現在のモンスターのMP: ")
    println(monster.getMP())

    print("現在の勇者のHP: ")
    println(hero.getHP())


    println("----------------")

    println("勇者は宿屋で寝た")
    hero.inn()
    print("現在の勇者のHP: ")
    println(hero.getHP())

}

実行結果

現在のモンスターのHP: 120
勇者は攻撃した!
現在のモンスターのHP: 115
----------------
現在の勇者のHP: 100
現在のモンスターのMP: 10
モンスターは魔法を使った!
現在のモンスターのMP: 7
現在の勇者のHP: 80
----------------
勇者は宿屋で寝た
現在の勇者のHP: 100