2017-12-14 1 views
1

나는 다음과 같은 문제를 내놓았다 :Kotlin에서 추상 클래스를 인스턴스화하는 방법은 무엇입니까?

내 MainActivity 코드 :

class MainActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     // ... 
     // ERROR: Cannot create instance of an abstract class 
     var db = DataBase().getDataBase(this) 
     // ... 
    } 
} 

룸의 데이터베이스 : 나는 코 틀린에 클래스를 인스턴스화 할 수 없습니다

@Database(entities = arrayOf(DataBaseUser::class), version = 1) 
abstract class DataBase : RoomDatabase() { 

    val DB_NAME : String = "DataBaseUser" 
    private lateinit var INSTANCE : DataBase 

    fun getDataBase(context: Context): DataBase { 
     if (INSTANCE == null){ 
      INSTANCE = Room.databaseBuilder(context.applicationContext,DataBase::class.java,DB_NAME).build() 
     } 
     return INSTANCE 
    } 

    abstract fun getUserDao(): DataBaseUserDao 
} 

. Java에서는 다음과 같이했습니다.

db = AppDataBase.getDataBase(view.getContext()); 

Kotlin에서 어떻게 동일한 결과를 얻을 수 있습니까?

+0

가능한 복제본 [추상 클래스를 인스턴스화 할 수 있습니까?] (https://stackoverflow.com/questions/4579305/can-we-instantiate-an-abstract-class) – Vlad

답변

7

가 (코 틀린 object에서) 싱글 톤을 사용하여 아래에 사용할 수있는 객실 데이터베이스 인스턴스 개최 :

@Database(entities = arrayOf(DataBaseUser::class), version = 1) 
abstract class DataBase : RoomDatabase() { 
    abstract fun getUserDao(): DataBaseUserDao 
} 

object DatabaseProvider { 
    val DB_NAME : String = "DataBaseUser" 
    private lateinit var INSTANCE : DataBase 

    fun getDataBase(context: Context): DataBase { 
     if (INSTANCE == null) { 
      INSTANCE = Room.databaseBuilder(context.applicationContext,DataBase::class.java,DB_NAME).build() 
     } 

     return INSTANCE 
    } 
} 

사용법 :

val db = DatabaseProvider.getDataBase(view.getContext()) 
0

Kotlin의 추상 클래스를 인스턴스화하려면 object: <your class>을 사용하십시오. 예 :

abstract class AbstractTest { 
    abstract fun someFun(): Int 
} 

fun main(args: Array<String>) { 
    val astractInstance = object : AbstractTest() { 
     override fun someFun(): Int { 
      TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
     } 
    } 
} 
0

당신은

var db = object: DataBase(){ 
    override fun getUserDao(): DataBase{ 
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 
    } 
} 
관련 문제