算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Kotlinでだって型クラスしたい!

無理です。

でもAdapterパターンをいい感じに使えばそれっぽいことができます。

したいことは既存のクラスに触らずにインタフェースを追加したいのでAdapterパターンなのです。

/** 人です。名前を持ってます */
class Person(val name: String)

/** 挨拶できる何かです */
trait Greeter {
  fun greet(): String
}

/** 挨拶を装飾します */
fun decorate(greeter: Greeter) = "☆★☆${greeter.greet()}☆★☆"

fun main(args : Array<String>) {
  val taro = Person("Taro")
  val greetingPhrase = decorate(taro) // ここでtaroをGreeterとしてdecorateに渡したい!!
  println(greetingPhrase)
}

拡張関数でおk。

fun Person.asGreeter() = object: Greeter {
  override fun greet() = "Hello, I'm $name"
}

これでPersonをいじらずに型を追加できました(PersonGreeterになる手段を手に入れた!)。

fun main(args : Array<String>) {
  val taro = Person("Taro")
  val greetingPhrase = decorate(taro.asGreeter())
  println(greetingPhrase) // => ☆★☆Hello, I'm Taro☆★☆
}