Martin Perry
Martin Perry

Reputation: 9527

Kotlin - same class, different internal class

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

Answers (1)

Andrei Tanana
Andrei Tanana

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

Related Questions