Generics Kotlin-同一类,不同的内部类

Generics Kotlin-同一类,不同的内部类,generics,kotlin,Generics,Kotlin,我有科特林的目标 object LocalizationHelper { var lang: String = "" get() = MyApi.getCurrentLanguage() fun initLanguage() { val preferredLanguage = Locale.getDefault().language.toLowerCase() lang = if (MyApi.setSupportedLangu

我有科特林的目标

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
}
有没有一种方法,如何拥有相同的类,但是使用
MyApi2
而不使用整个
LocalizationHelper
的重复代码

原因是我在带有
MyApi
的主应用程序中使用了这个helper类,对于widget,我需要简化的
MyApi2
。然而,90%的时间里,我都会将它与
MyApi
一起使用

我想,像“代码”>“t>代码”之类的泛型对象默认为MyAPI >是不错的,但我不确定它是如何或是否可以被实现的(注意:我主要是C++程序员,这是可能的)。

对象本地化帮助器{
var lang:String=“”
get()=T.getCurrentLanguage()
有趣的语言(){
val preferredLanguage=Locale.getDefault().language.toLowerCase()
lang=if(T.setSupportedLanguage(preferredLanguage))preferredLanguage else“en”
}
//其他方法
}

您可以提取
MyApi
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
}
然后,您可以将
LocalizationHelper
的常见行为移动到抽象父级:

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
}
并使用适当的api安装对象:

object LocalizationHelper : LocalizationHelperAbstract(MyApi)

object LocalizationHelper2 : LocalizationHelperAbstract(MyApi2)
object LocalizationHelper : LocalizationHelperAbstract(MyApi)

object LocalizationHelper2 : LocalizationHelperAbstract(MyApi2)