как использовать дженерики в Scala
Я закодировал этот компонент, чтобы чередовать разные языки:
import scala.collection.mutable.Map
sealed trait Language
case object English extends Language {
val messages: Map[String, String] =
Map("M01" -> "Ready for cooking - press START",
"M02" -> "Close the door to start cooking")
}
case object French extends Language {
val messages: Map[String, String] =
Map("M01" -> "Pret pour la cuisson - presse START",
"M02" -> "Fermez la porte pour commencer la cuisson")
}
class Lang {
//The default Language
private var language: Language = English
def chosen(lang: Language) = language = lang
def displayMessage(msg: String) = language match {
case English => English messages msg
case French => French messages msg
}
}
Меня интересует, как использовать параметризацию, чтобы построить такой компонент, а затем настроить его с различными языками, заданными его параметру?
2 ответов:
Я не думаю, что вам действительно нужен дженерик в этом случае.
Также... ваш дизайн чувствует, что в нем что-то не так. В любом случае... если вы думаете, что у вас есть прецедент для дженериков... вы можете сделать это таким образом.
Измените свою черту a liitle
sealed trait Language { val messages: Map[ String, String ] }Теперь определите свой универсальный класс следующим образом,
class Lang[ A <: Language ]( var language: A = English ) { def chosen( lang: A ): Unit = { language = lang } def displayMessage(msg: String): Unit = { language messages msg } }
Ваш код выглядит простым и чистым, я не уверен, что дженерики улучшат его.
Но вы можете перенести реализацию Lang в язык. Вы должны были бы передать объекты языка в качестве аргументов метода, возможно, как имплициты. Тип аргументов будет T
Я, вероятно, предпочел бы придерживаться вашей простой таблицы поиска, но изменить класс Lang на object Language, сопутствующий объект языковой черты.
Comments