我正在Java中的一个项目,我决定使用MVC架构。
我有 Model
类,看起来像这样:
public class Model {
static String table_name = null;
// ...
public static Model create(Map<String, Object> data) {
// insert `data` into database table `table_name`
}
// ...
}
我想拥有扩展Model
的类User
,但我不想在User
中重新实现create()
。我只想更改table_name
的值,并希望继承的create()
使用子类的table_name
:
public class User extends Model {
static String table_name = "users";
// ...
}
我该如何实现?
我知道一个解决方案,其中我将setTableName()
方法添加到Model
,但这仅在table_name
不静态的情况下起作用。但是,我需要它是静态的,因为我希望create()
是静态的,以便我可以这样做:User.create()
。
在模型类上有一个静态方法称为'创建'的事实,并不意味着在用户类上会自动有一种静态'创建'方法,该方法扩展了模型类 - 静态方法属于类,并且它们没有继承。如果您在子类上实现自己的"创建"方法,则该方法与模型类上的"创建"方法之间没有关系。听起来您想要一家工厂。
如果您想坚持到到目前为止所做的类似的方法,类似的方法可能会起作用。它将持久性逻辑保持在一个地方,同时允许每个模型定义自己的表名和数据映射。
abstract class Model {
private PersistenceManager persistenceManager = new PersistenceManager();
abstract String getTableName();
abstract Model map(Object persistenceResult);
public void load(Map<String, Object> data) {
Object persistenceResult = persistenceManager.create(data, getTableName());
//Set appropriate fields on this class.
map(persistenceResult);
}
}
class User extends Model {
@Override
String getTableName() {
return "Users";
}
@Override
Model map(Object persistenceResult) {
//Mapping logic.
return null;
}
}
class PersistenceManager {
public Object create(Map<String, Object> data, String tableName) {
//Persistence logic.
//Return result of DB insert here.
return null;
}
}
class ModelFactory {
public static Model createModel(Class modelClass, Map<String, Object> data) {
Model model;
if (modelClass == User.class) {
model = new User();
} else {
//Cater for other models.
throw new IllegalArgumentException("Invalid model.");
}
model.load(data);
return model;
}
}
您可以按以下方式使用它。
Map<String, Object> userData = new HashMap<>();
userData.put("name", "Bob");
Model user = ModelFactory.createModel(User.class, userData);
代码中仍然有清理空间(例如使用仿制药),但我将其保留给您。
父母无法访问孩子的成员(正确地)。在这里看
您可以做的是创建一个受保护的方法来执行任务(它也接受tableName)并使用它。
public class Model {
static String table_name = "A";
public static Model create(Map<String, Object> data) {
return create(data, table_name);
}
protected static Model create(Map<String, Object> data, String table_name) {
// logic here
}
}
public class User extends Model {
static String table_name = "B";
public static Model create(Map<String, Object> data) {
return create(data, table_name);
}
}