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
をいじらずに型を追加できました(Person
はGreeter
になる手段を手に入れた!)。
fun main(args : Array<String>) { val taro = Person("Taro") val greetingPhrase = decorate(taro.asGreeter()) println(greetingPhrase) // => ☆★☆Hello, I'm Taro☆★☆ }