将变量传递到父级';Kotlin的s构造函数

将变量传递到父级';Kotlin的s构造函数,kotlin,Kotlin,我试图将变量从子类传递到父类的构造函数 class TodoListDBHandler(context: Context, factory: SQLiteDatabase.CursorFactory) : SQLiteOpenHelper(context, "todoList.db", factory, 1) { override fun onCreate(db: SQLiteDatabase) { } override fun

我试图将变量从子类传递到父类的构造函数

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) {
        }
}
父类的构造函数由
(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.
    }
}
如上所述,我希望能够将我指定的变量传递给父级的构造函数

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) {
        }
}
编辑:这是所需的代码,但使用Java

public-TodoListDBHandler(上下文,SQLiteDatabase.CursorFactory){
//databaseFileName和databaseVersion已在类中指定
超级(上下文、数据库文件名、工厂、数据库版本)
}

您可以直接在超类构造函数中传递常量参数

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) {
        }
}

您可以直接在超类构造函数中传递常量参数

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) {
        }
}

@farhanjk给出了一个很好的解决方案,但您也可以将它们放入同伴对象中:

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

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

    ...
}

这可能很有用,例如,如果有非常重要的初始化,或者只创建一次列表,等等。

@farhanjk提供了一个很好的解决方案,但您也可以将它们放入伴随对象中:

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

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

    ...
}

这可能很有用,例如,如果有非平凡的初始化或只创建一次列表,等等。

即使在Java中,这也只有在databaseFileName和databaseVersion是静态字段时才可能实现。在初始化派生类之前,总是调用超类的构造函数。即使在Java中,这也只有在databaseFileName和databaseVersion是静态字段时才可能实现。在初始化派生类之前,总是调用超类的构造函数。