Передача переменных в родительский конструктор в Kotlin

#kotlin

#kotlin

Вопрос:

Я пытаюсь передать переменные из дочернего класса в родительский конструктор.

Конструктор родительского класса состоит из (Context!, String!, SQLiteDatabase.CursorFactory!, Int) .

Я могу легко сделать

 class TodoListDBHandler(context: Context, databaseName: String, factory: SQLiteDatabase.CursorFactory, databaseVersion: Int): 
    SQLiteOpenHelper(context, databaseName, factory, databaseVersion)
  

но я хотел бы указать имя и версию базы данных непосредственно внутри класса, а не указывать их каждый раз, когда я вызываю конструктор, поскольку я могу допустить ошибки.

Мой текущий код:

 class TodoListDBHandler(context: Context, databaseName: String, factory: SQLiteDatabase.CursorFactory, databaseVersion: Int): 
    SQLiteOpenHelper(context, databaseName, factory, databaseVersion) {

    val databaseFileName = "todoList.db"
    val databaseVersion = 1

    override fun onCreate(db: SQLiteDatabase?) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}
  

Как указано выше, я хотел бы иметь возможность передавать переменную, которую я указал, в родительский конструктор.

РЕДАКТИРОВАТЬ: это желаемый код, но на Java

 public TodoListDBHandler(Context context, SQLiteDatabase.CursorFactory factory) {
    // databaseFileName and databaseVersion are already specified inside the class
    super(context, databaseFileName, factory, databaseVersion)
}
  

Комментарии:

1. Даже в Java это возможно только в том случае, если databaseFileName и databaseVersion являются статическими полями. Конструктор суперкласса всегда вызывается перед любой инициализацией производного класса.

Ответ №1:

Вы можете передать постоянные аргументы непосредственно в конструкторе суперкласса.

 class TodoListDBHandler(context: Context, factory: SQLiteDatabase.CursorFactory)
        : SQLiteOpenHelper(context, "todoList.db", factory, 1) {

        override fun onCreate(db: SQLiteDatabase) {
        }

        override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        }
}
  

Ответ №2:

@farhanjk дает хорошее решение, но вы также можете поместить их в сопутствующий объект:

 class TodoListDBHandler(context: Context, factory: SQLiteDatabase.CursorFactory): 
    SQLiteOpenHelper(context, TodoListDBHandler.databaseName, factory, TodoListDBHandler.databaseVersion) {

    companion object {
        val databaseFileName = "todoList.db"
        val databaseVersion = 1
    }

    ...
}
  

Это может быть полезно, например, при нетривиальной инициализации или для создания списка только один раз и т.д.