Kotlin 当从派生类初始化但从超级类调用时,基类中的变量为null
我无法将继承的单例模式从Java转换为KotlinKotlin 当从派生类初始化但从超级类调用时,基类中的变量为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
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()
}
}