プログラミング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のようなコレクションで使うことを想定してるのかな。
参考文献では本↔本棚で書かれていたけど、似非化学系なので試薬↔試薬庫で書いてみた。