Caller
のインスタンスを作成できるファクトリメソッドを使用する方がよいでしょう。 IntCaller
とDoubleCaller
の間で異なるのは、toInt
とtoDouble
です(もちろん種類もあります)。
trait Caller {
type EntityType
def parseEntity(entity: String): EntityType
}
object Caller {
def apply[A](f: String => A): Caller = new Caller {
type EntityType = A
def parseEntity(entity: String): EntityType = f(entity)
}
}
scala> val IntCaller = Caller(_.toInt)
scala> IntCaller.parseEntity("123")
res1: IntCaller.EntityType = 123
scala> val DoubleCaller = Caller(_.toDouble)
scala> DoubleCaller.parseEntity("1.23")
res2: DoubleCaller.EntityType = 1.23
継承を使用し続けたい場合は、parseEntity
との変換を実装するために、サブクラスや特性を強制し続けています。ただし、暗黙のコンバージョンを使用する必要はありません。繰り返しコードがある唯一の理由は、暗黙的な変換によってparseEntity
が実際には(暗黙的に解決する必要があるため)同じであるように見えるためです。
trait Caller {
type EntityType
def parseEntity(entity: String): EntityType
}
trait IntCaller {
type EntityType = Int
def parseEntity(entity: String): EntityType = entity.toInt
}