从扩展类访问属性

时间:2016-03-03 23:00:14

标签: java

我试图创建一个模型结构,访问数据库,灵感来自Laravel的Eloquent(PHP)。

基本上我有一个名为Model的课程,现在它只是空的。

然后我又找到了另一个名为User的课程,该课程扩展了Model

public class User extends Model {

    private String table = "users";
}

正如您所看到的,User类还有一个名为table的属性,它引用模型所代表的数据库上的表。

Model.java我的内部,然后尝试获取表格的名称。

到目前为止,我在我的Model.java构造函数上运行了一些代码,我在该实例上遍历了所有字段。这给了我一个Field对象,但是我无法从Model.java

获取表的内容

Model.java

public abstract class Model {

    public Model()
    {
        List<Field> fields = new ArrayList<>();
        for (Class<?> c = this.getClass(); c != null; c = c.getSuperclass()) {
            fields.addAll(Arrays.asList(c.getDeclaredFields()));
        }
        for (Field field : fields)
        {
            String name = field.getName(); //returns "table"
        }
    }
}

总而言之,我需要的是从类扩展模型中获取表名。

有什么想法吗?或者这是一种不好的做法?

1 个答案:

答案 0 :(得分:2)

模型应该有一个抽象方法getTableName

是的,这是不好的做法,因为一个类不应该知道继承它的类的细节。

你这样做的方式,没有合同规定子类必须实现那个字段。

通过创建一个必须由子类实现的方法,有一个明确的契约,并且您正在应用依赖项反转原则。见https://en.m.wikipedia.org/wiki/Dependency_inversion_principle

public abstract class Model {

    public Model() {}

    abstract String getTableName();
}

public class User extends Model() {
    public String getTableName(){
      return "users";
    }
}