我有一些抽象类,我用它作为我所有模型的基础。为简单起见,我将仅讨论称为模型的根抽象类 - 它需要处理一些重复的ORMLite操作。在每次操作之前,我需要对所有模型应用一些逻辑标准。所以关键是我可以在调用对象上实现保存,更新和删除,而不必重复代码。
abstract public class Model<MODEL extends Model, CHILD extends ChildModel> {
private final List<CHILD> mChildren = new ArrayList<>();
private Class<CHILD> mChildClass;
private Class<MODEL> mModelClass;
protected RuntimeExceptionDao<MODEL, Long> mRTEDao;
public Model(Class<MODEL> modelClass, Class<CHILD> childClass) {
this.mChildClass = childClass;
this.mModelClass = modelClass;
this.mRTEDao = App.getOpenHelper().getRTEDao(this.mModelClass);
}
// some codes omitted...
public void save() {
// Do something to the object before continuing
mRTEDao.create(this);
}
public void delete() {
// Do something to the object before continuing
mRTEDao.delete(this);
}
// some codes omitted...
}
上面的代码给出了一个错误,因为DAO期望子类“MODEL”,而这个指的是模型&lt; MODEL,CHILD&gt;
目前的解决方法如下:
// some codes omitted...
abstract protected void handleUpdate(); // Let the subclass handle the create/update
abstract protected void handleDelete(); // Let the subclass handle the delete
public void save() {
// Do something to the object before continuing
handleUpdate();
}
public void delete() {
// Do something to the object before continuing
handleDelete();
}
// some codes omitted...
至少我减少了每个模型的代码 - 但它看起来仍然不优雅。有没有办法让我抓住子类的“this”对象而不是基类Model类?我试过施法,但这给了我一个警告,说它是一个未经检查的演员。
public void save() {
mRTEDao.create((MODEL)this);
}
public void delete() {
mRTEDao.delete((MODEL)this);
}
例如,这个project为模型类提供了一种优雅的方式来保存,更新,删除自身。但遗憾的是,它缺少ORMlite中我需要的功能,但由于需要对基本模型进行生成,我似乎无法让ORMlite在我的项目中执行相同的操作。
答案 0 :(得分:0)
Ahhh为自己找到了一个很好的解决方案:)只需简单地实现一个这样的抽象方法:
abstract protected MODEL getThis();
以下是实施:
@Override
protected ExampleModel getMe() {
return this;
}
然后每当我需要这个表现得像我正在使用的子类的这个时那样:
public void save() {
// Do something to the object before continuing
mRTEDao.create(getThis());
}
public void delete() {
// Do something to the object before continuing
mRTEDao.delete(getThis());
}