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

时间:2016-12-24 03:38:06

标签: java inheritance architecture

我正在研究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()

2 个答案:

答案 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),但我会把它留给你。