我正在研究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`
}
// ...
}
我希望课程User
延伸Model
,但我不想在create()
中重新实施User
。我只想更改table_name
的值,并希望继承的create()
使用子类&#39; table_name
:
public class User extends Model {
static String table_name = "users";
// ...
}
我怎样才能做到这一点?
我知道一种解决方案,我将setTableName()
方法添加到Model
,但仅当table_name
非静态时才有效。但是,我需要它是静态的,因为我希望create()
是静态的,以便我可以这样做:User.create()
。
答案 0 :(得分:1)
父母无法访问孩子的成员(这是理所当然的)。看here
你可以做的是创建一个受保护的方法来完成任务(它也接受表名)并改为使用它。
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);
}
}
答案 1 :(得分:1)
有一个名为&#39;创建&#39;的静态方法。在Model类上并不意味着会自动产生静态的&#39;创建&#39;扩展Model类的User类的方法 - 静态方法属于类,并且它们不会被继承。如果您实施自己的&#39;创建&#39;在子类上的方法,它与&#39;创建&#39;之间没有关系。 Model类的方法。听起来你想要一个Factory。
如果你想坚持类似于你迄今为止所采取的方法,那么这样的事情可能会奏效。它将持久性逻辑保留在一个位置,同时允许每个模型定义自己的表名和数据映射。
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);
代码中仍有清理空间(比如使用Generics),但我会把它留给你。