使继承的方法使用子类的变量而不是超类'



我正在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);
    }
}

最新更新