从扩展类访问属性
问题描述:
我试图创建一个模型结构,访问数据库,灵感来自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"
}
}
}
一切的一切,我需要是从类获得表名这是扩展模型。
任何想法?或者这是一种不好的做法?
答
型号应该有一个抽象方法,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";
}
}
模型应该有一个抽象方法getTableName。这是不好的做法,一个班级永远不应该知道继承它的班级的细节 –
您是否愿意启发我如何做到这一点? :)我以前没有真正使用过抽象方法。 – Jazerix
您将在扩展类中使用具体方法覆盖它,为您的私有变量创建一个简单的getter。 –