2015-04-09 2 views
2

Я закодирован этот компонент, чередовать между различными языками:как использовать дженерики в 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

Я не думаю, что вам действительно нужен общий в этом случае.

Также ... ваш дизайн чувствует, что-то об этом. В любом случае ... если вы думаете, что у вас есть прецедент для дженериков ... вы можете сделать это таким образом.

Измените свой признак 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 
    } 

} 
+0

«ваш дизайн чувствует что-то от об этом» - вы думаете, что я сделал плохо дизайн? Я хотел бы знать, так ли это, потому что я намерен попробовать разные способы разработки, и вы знаете, что у Scala есть много способов сделать что-то и понять, что является предпочтительным! Спасибо за решение. – Valerin

+1

@ Valerin Дизайн, плохой или хороший, полностью зависит от варианта использования. Итак ... Я не знаю, плохо это или хорошо для вашего случая использования. Но для меня это выглядит необычно. –

+0

Мы не можем вызывать поле 'messages', хотя эта ссылка:' language messages msg' – Valerin

2

Ваш код выглядит простым и чистым, я не уверен, что дженерики улучшат его.

Но вы можете перенести реализацию Lang на язык. Вам нужно передать объекты языка в качестве аргументов метода, возможно, как implicits. Тип аргументов будет T < Язык.

Я бы скорее придерживался вашей простой таблицы поиска, но сменил класс Lang на объект Язык, сопутствующий объект языковой черты.

Смежные вопросы