从扩展类访问属性

问题描述:

我试图创建一个模型结构,访问数据库,灵感来自Laravel的雄辩(PHP)。从扩展类访问属性

基本上我有一个叫Model的类,现在它只是空的。

然后我得到了另一个类称为User,延伸Model

public class User extends Model { 

    private String table = "users"; 
} 

正如你可以看到User类也有一个叫做表属性,它指的是表中的模型是代表在数据库上。

在我的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

模型应该有一个抽象方法getTableName。这是不好的做法,一个班级永远不应该知道继承它的班级的细节 –

+0

您是否愿意启发我如何做到这一点? :)我以前没有真正使用过抽象方法。 – Jazerix

+0

您将在扩展类中使用具体方法覆盖它,为您的私有变量创建一个简单的getter。 –

型号应该有一个抽象方法,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"; 
    } 
} 
+0

我真的明白你在说什么,但我可能只是创建一个界面。这样,我将不得不在每个类中实现相同的方法,基本上也是这样。 – Jazerix

+0

也一样吗?他们都不会返回一个不同的表名吗? –

+0

啊,我明白你要去哪里了。编辑说清楚了,谢谢:) – Jazerix