プログラミング1(Kotlin+Iteratorパターン)

Kotlin勉強中です。とても楽しい。
Iteratorパターン以降もアウトプットを兼ねて書いていきます。

抽象クラスと具象クラス

抽象クラス

・Aggregate → 集合体のinterface
Iterator → 集合体を数えるinterface

具象クラス

・Reagent → 試薬のIDと名前を表すdata class
・ReagentStorage → 試薬庫を示すclass
・ReagentStorageIterator → 試薬庫数えるclass
・Main → Mainclass

コード

Aggregate & Iterator

interface Aggregate{
	abstract fun iterator():Iterator
}

interface Iterator{
	abstract fun hasNext():Boolean
	abstract fun next():Any
}

Reagent

Javaと違ってデータを表すクラスを作成した場合にgetter/setterを書かなくて良いのが素晴らしい。

data class Reagent(val id:Int, val name:String)

ReagentStorage

class ReagentStorage(): Aggregate{

    private val reagents:MutableList<Reagent> by lazy{ mutableListOf() }
    
    private var last:Int = 0
    
    val getLength:Int get() = last
    
    fun getReagentAt(index:Int):Reagent = reagents[index]  
    
    fun appendReagent(reagent:Reagent){
        reagents.add(last,reagent)
        last++  
    }
    
    override fun iterator():Iterator = ReagentStorageIterator(this)
}

ReagentStorageIterator

class ReagentStorageIterator(val reagentstorage:ReagentStorage,private var index:Int = 0):Iterator{
    
    override fun hasNext():Boolean = index < reagentstorage.getLength
    
    override fun next():Any{
        val reagent:Reagent = reagentstorage.getReagentAt(index)
        index++
        return reagent
    }
}

Main

fun main(){
    val reagentstorae:ReagentStorage = ReagentStorage()
    
    reagentstorage.apply{
    	appendReagent(Reagent(1,"HCl"))
	appendReagent(Reagent(2,"H2SO4"))
    	appendReagent(Reagent(3,"HNO3")) 
    }
    
    val it:Iterator=reagentstorage.iterator()
    while(it.hasNext()){
        val reagent:Reagent = it.next() as Reagent
        println("ID:${reagent.id} Name:${reagent.name}")
    }
}

実行結果

ID:1 Name:HCl
ID:2 Name:H2SO4
ID:3 Name:HNO3
まとめ

setのようなコレクションで使うことを想定してるのかな。
参考文献では本↔本棚で書かれていたけど、似非化学系なので試薬↔試薬庫で書いてみた。