Reputation: 9527
I have Kotlin object
object LocalizationHelper {
var lang: String = ""
get() = MyApi.getCurrentLanguage()
fun initLanguage() {
val preferredLanguage = Locale.getDefault().language.toLowerCase()
lang = if (MyApi.setSupportedLanguage(preferredLanguage)) preferredLanguage else "en"
}
//bunch of other methods
}
Is there a way, how to have the same class, but with MyApi2
without the duplicate code of entire LocalizationHelper
?
The reason is that I am using this helper class in the main application with MyApi
and for widget, I need simplified MyApi2
. However, 90% of time, I use it with MyApi
.
I have thought, that something like generic object with T
that defaults to MyApi
would be nice, but I am not sure, how or if it can be achived (note: I am mainly C++ programmer, where this is possible).
object LocalizationHelper<T> {
var lang: String = ""
get() = T.getCurrentLanguage()
fun initLanguage() {
val preferredLanguage = Locale.getDefault().language.toLowerCase()
lang = if (T.setSupportedLanguage(preferredLanguage)) preferredLanguage else "en"
}
//bunch of other methods
}
Upvotes: 2
Views: 31
Reputation: 8442
You can extract an interface of MyApi
and MyApi2
:
interface Api {
fun getCurrentLanguage(): String
fun setSupportedLanguage(language: String): Boolean
}
object MyApi : Api {
override fun getCurrentLanguage() = "en"
override fun setSupportedLanguage(language: String) = true
}
object MyApi2 : Api {
override fun getCurrentLanguage() = "de"
override fun setSupportedLanguage(language: String) = true
}
then you can move common behavior of LocalizationHelper
to abstract parent:
abstract class LocalizationHelperAbstract(private val api: Api) {
var lang: String = ""
get() = api.getCurrentLanguage()
fun initLanguage() {
val preferredLanguage = Locale.getDefault().language.toLowerCase()
lang = if (api.setSupportedLanguage(preferredLanguage)) preferredLanguage else "en"
}
//bunch of other methods
}
and instatiate objects with appropriate api:
object LocalizationHelper : LocalizationHelperAbstract(MyApi)
object LocalizationHelper2 : LocalizationHelperAbstract(MyApi2)
Upvotes: 3