タイプの正しい暗黙のクラスは、そのスーパークラスだけを知ることでどのようにして見つけることができますか?Scalaでは、スーパークラスだけを知っている型クラスを暗黙的に呼び出す方法は?
MainRunnerクラスでは、すべての型でパターンマッチングを行うAllCommandHandler
型クラスを実装する必要があります。 AllCommandsHandler
を実装せずに、スーパータイプUserCommand
の正しいタイプのクラスを見つける方法はありますか?私のコードの一部は、入力されたコマンドを検証した後、データベースから来るか生成されますのいずれかList[UserCommand]
を取得するので、私はこれを必要と
val command: UserCommand = CreateUser("userId2")
CommandHandlerRunner.processCommand(command)
理由があります。あなたが(それはUserCommand
がsealed
であることが重要である方法である)CreateUser
かUpdatePassword
のいずれかとしUserCommand
を表すことができますので、下記のUserCommand
ため
私のコード
import annotation.implicitNotFound
@implicitNotFound("No member of type class CommandHandler in scope for ${C}")
trait CommandHandler[C <: UserCommand] {
def processCommand(command: C)
}
trait Command
sealed trait UserCommand
case class CreateUser(id: String) extends UserCommand
case class UpdatePassword(id: String, password: String) extends UserCommand
object CommandHandler {
implicit object CreateUserCommandHandler extends CommandHandler[CreateUser] {
override def processCommand(command: CreateUser) = println(command)
}
implicit object UpdateUserPasswordCommandHandler extends CommandHandler[UpdatePassword] {
override def processCommand(command: UpdatePassword) = println(command)
}
//I have to do this which is ugly. Is there a way I can invoke the right CommandHandler without doing the following ?
implicit object AllCommandsHandler extends CommandHandler[UserCommand] {
override def processCommand(command: UserCommand) = command match {
case command: CreateUser =>
CommandHandlerRunner.processCommand(command)
case command: UpdatePassword =>
CommandHandlerRunner.processCommand(command)
case _ =>
sys.error("CommandHandler not found.")
}
}
}
object CommandHandlerRunner {
def processCommand[C <: UserCommand](command: C)(implicit commandHandler: CommandHandler[C]) =
commandHandler.processCommand(command)
}
object MainRunner extends App {
CommandHandlerRunner.processCommand(CreateUser("userId1"))
CommandHandlerRunner.processCommand(UpdatePassword("userId1", "newPassword"))
//In my application in certain situation I get a List[UserCommand] (database query) and I want to invoke processCommand their relevant
//handlers. How do I get this to work ?
val command: UserCommand = CreateUser("userId2")
CommandHandlerRunner.processCommand(command)
}
'UserCommand'が封印された形質であった場合は、これは可能です。 –
はい、それは封印された形質です。私はコードを更新しました。私は形を変えて読んでみるつもりです。 – hajime