gpt4 book ai didi

java - 使继承的方法使用子类的变量而不是父类(super class)的变量

转载 作者:行者123 更新时间:2023-11-30 02:42:13 25 4
gpt4 key购买 nike

我正在开发一个 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,但我不想在 中重新实现 create() >用户。我只想更改 table_name 的值并希望继承的 create() 使用子类的 table_name:

public class User extends Model {
static String table_name = "users";

// ...
}

我怎样才能实现这个目标?

<小时/>

我知道一个解决方案,可以将 setTableName() 方法添加到 Model 中,但仅当 table_name 是非静态时才有效。但是,我需要它是静态的,因为我希望 create() 是静态的,以便我可以执行以下操作:User.create()

最佳答案

Model 类上有一个名为“create”的静态方法这一事实并不意味着扩展 Model 类的 User 类上将自动存在一个静态“create”方法 - 静态方法属于该类,而且它们不是遗传的。如果您在子类上实现自己的“create”方法,则它与 Model 类上的“create”方法之间没有任何关系。听起来你想要一个 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);

代码中仍有清理空间(例如使用泛型),但我将其留给您。

关于java - 使继承的方法使用子类的变量而不是父类(super class)的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41310115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com