其背后的原因是什么?是为了表现还是强迫?请解释
首先,我们需要了解有关抽象类的一件事,其中允许您跳过实现父级类的某些默认方法
与您实现所有接口方法的Interfaces
不同,在抽象类世界中,儿童类可以选择实现儿童类特定的内容,并在不需要的情况下遗漏其他实现。
如果您对父室室数据库文档进行深入研究,您会注意到它是所有房间数据库的基类,并且它具有一些对子类的方法,例如。createOpenHelper()
,createInvalidationTracker()
,clearAllTables()
。
实际上,文档清楚地提到了'roomDatabase提供了对基础数据库实现的直接访问,但是您应该更喜欢使用dao类'。
简单地说,您应该将房间类别标记为 Abstract
,以使您的类变得灵活,然后跳过实现RoomDatabase Base类的不必要方法。
这是正确的,因为当您不将类标记为抽象时,您将获得错误,而Android Studio会提示您实现上述基础类方法。
所以在Kotlin中,您将做类似的事情:
@Database(entities = [Note::class], version = 1)
abstract class NoteDatabase :RoomDatabase() {
//Property must be initialized or be abstrac
abstract val noteDAO:NoteDAO
}
在这里, NoteDatabase
从roomdatabase继承以使其成为室database对象 - 它不需要父母的默认实现,因此它跳过了这些实现,因为它用抽象标记。
NOTEDATABASE只需要声明一个抽象的noteDao
变量即可。因此,NoteDatabase知道DAO接口,并且此变量也用于测试。
因为RoomDatabase
已定义方法,因此继承类不能是接口。而且由于您在该抽象类中写下未定义的方法,所以它不能是一个类。
public interface MyDatabase extends RoomDatabase // extend is not allowed for interface
public class MyDatabase extends RoomDatabase {
public abstract MyDao myDao(); // abstract method is not allowed for non abstract class
}
因为房间提供了通过sqlite上的抽象层,以允许流利的数据库访问,同时利用sqlite的全部功能。
房间是一个ORM,对象关系映射库。换句话说,房间会将我们的数据库对象映射到Java对象。房间提供了SQLite上的抽象层,以允许使用SQLite的全部功能时流利的数据库访问。
当类扩展抽象类时,它需要覆盖其所有抽象方法。但是,在我们的情况下,我们不需要实现 roomDatabase 类的抽象方法。因此,要克服我们需要使我们的房间数据库类摘要。
abstract class ABC{
public abstract void methodA();
public abstract void methodB();
public abstract void methodC();
}
public class OurClass extends ABC{
public void methodA(){
System.out.println("Only methodA implementation");
}
}
这将给出编译时间错误。
解决方案1:在子类中实现父类的所有抽象方法。
解决方案2 :(我们的情况(使子类摘要。
如果这些语句中的任何一种适用于您的情况:
考虑使用抽象类:- 您想在几个密切相关的几个密切相关的地方共享代码课程。
- 您希望扩展您的抽象课的课程许多常见的方法或字段,或需要公共以外的其他访问修饰符(例如受保护和私人(。
- 您想声明非静态或非最终字段。这使您能够定义可以访问和修改状态的方法它们所属的对象。