#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
}
...
}
Это может быть полезно, например, при нетривиальной инициализации или для создания списка только один раз и т.д.