Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 当从派生类初始化但从超级类调用时,基类中的变量为null_Kotlin_Inheritance_Singleton_Kotlin Lateinit_Kotlin Companion - Fatal编程技术网

Kotlin 当从派生类初始化但从超级类调用时,基类中的变量为null

Kotlin 当从派生类初始化但从超级类调用时,基类中的变量为null,kotlin,inheritance,singleton,kotlin-lateinit,kotlin-companion,Kotlin,Inheritance,Singleton,Kotlin Lateinit,Kotlin Companion,我无法将继承的单例模式从Java转换为Kotlin open class ThumbnailManager { lateinit var data: Data companion object{ fun getInstance(): ThumbnailManager{ return ThumbnailManager() } } open fun setContent() open fun setDat

我无法将继承的单例模式从Java转换为Kotlin

open class ThumbnailManager {

   lateinit var data: Data

   companion object{
       fun getInstance(): ThumbnailManager{
           return ThumbnailManager()
       }
     }
     open fun setContent()
     open fun setData(){
         data = ...// data is indeed set 
     }
}

class ThumbnailManagerLite : ThumbnailManager(){

   companion object{
       fun getInstance(): ThumbnailManagerLite{
           return ThumbnailManagerLite()
       }
   }

   override fun setContent(){
       setData()
   }
}
我从一个主要类(不是lite)调用ThumbnailManager.getInstance()。gameData和gameData为null,尽管它肯定是通过ThumbnailManagerLite初始化的。
我注意到,当我调用ThumbnailManagerLite.getInstance()时,没有对super的调用。

每次调用
ThumbnailManager.getInstance()
时,都会创建
ThumbnailManager
的新实例。在Kotlin中,您可以使用关键字实现单例模式:

object ThumbnailManager {
    
    lateinit var data: Data

    fun setContent() { 
    }

    fun setData() {
    }
}
但它不支持继承

您可以尝试使用:


您可以使用对象关键字而不是类来表示Kot中的singleton,通常singleton是不可继承的。请检查我编辑的答案。我在singleton中添加了关于委派而不是继承的信息。这可能会有帮助。
interface IThumbnailManager {
    fun setContent()
    fun setData()
}

object ThumbnailManager : IThumbnailManager {

    lateinit var data: Data


    override fun setContent() {
    }

    override fun setData(){
    }
}

object ThumbnailManagerLite : IThumbnailManager by ThumbnailManager {

    override fun setContent(){
        setData()
    }
}