Java 使用子类的字段执行父方法
想到以下问题的优雅的解决方案,我的头很痛。我有一个父类和几个子类。我的父类声明并实现了一个检索属性的方法,但是属性文件的名称由子类决定 我只处理子类的实例 该方法(在父类中实现)应该使用子类的字段值,但是因为我在父类中使用它,所以我也需要在那里声明它 现在,每次我从子类调用该方法时,都会使用父类的字段值 一些简单的代码来说明我的问题(请记住:这与功能无关,更多的是关于设计)。定义要使用的字段值的子类:Java 使用子类的字段执行父方法,java,design-patterns,inheritance,Java,Design Patterns,Inheritance,想到以下问题的优雅的解决方案,我的头很痛。我有一个父类和几个子类。我的父类声明并实现了一个检索属性的方法,但是属性文件的名称由子类决定 我只处理子类的实例 该方法(在父类中实现)应该使用子类的字段值,但是因为我在父类中使用它,所以我也需要在那里声明它 现在,每次我从子类调用该方法时,都会使用父类的字段值 一些简单的代码来说明我的问题(请记住:这与功能无关,更多的是关于设计)。定义要使用的字段值的子类: public class SubClass extends Parent { public
public class SubClass extends Parent {
public static final String CONFIG_FILE = "subclass.properties"; // same problem with non-static
public SubClass() {
System.out.println(getProperty("somekey"));
}
}
public class Parent {
public static final String CONFIG_FILE = "config.properties"; // same problem with non-static
public String getProperty(String key) {
Properties props = new Properties();
try {
props.load(new FileReader(new File(CONFIG_FILE)));
}
catch (IOException ioe) {
return null;
}
return props.get(key);
}
以及定义和实现我要使用的方法的父类:
public class SubClass extends Parent {
public static final String CONFIG_FILE = "subclass.properties"; // same problem with non-static
public SubClass() {
System.out.println(getProperty("somekey"));
}
}
public class Parent {
public static final String CONFIG_FILE = "config.properties"; // same problem with non-static
public String getProperty(String key) {
Properties props = new Properties();
try {
props.load(new FileReader(new File(CONFIG_FILE)));
}
catch (IOException ioe) {
return null;
}
return props.get(key);
}
由于我正在从子类调用
getProperty(..)
,我希望它使用它正在操作的实例的字段值(“subclass.properties”),但它使用的是父字段值(“config.properties”)。我对非静态字段也有同样的效果。只需在子类中重写(即实现)getProperty()
。查看您的代码,您使用的是Parent.CONFIG_文件
,在子类中您应该使用subclass.CONFIG_文件
将其放入子类中。这将返回子类的属性。此方法将重写父类中的方法
public String getProperty(String key) {
return CONFIG_FILE;
}
顺便说一句,你是变量
或者,我建议将变量名传递给构造函数,然后让它调用super
public SubClass() {
super(SUB_CLASS_CONFIG);
}
然后让家长来解释一下
public Parent(String key) {
CONFIG_FILE = key;
}
这样就不必重写该方法。该方法只能在父级中返回config。我会仔细考虑您是否希望它是静态的,尽管……在我的子类中重写
getProperty(…)
没有帮助。我希望父级实现该方法。因此return super.getProperty(key)
将产生相同的输出。不必在子类中实现该方法正是这里的挑战。这可以使用Bohemian和thiago.lenz答案来解决。不,这两个答案都不适用于该问题。我想避免在子类中一次又一次地实现这个方法,我有几个子类,我有几个子类,但父类必须处理所有子类。如果我想在子类中实现该方法,我需要类似于的解决方案,但我不想这样做,因为功能是相同的(除了文件名)。你给了我一个好主意。我的子类现在定义了配置文件
并将其传递给构造函数父类(字符串文件名)
。然后,我可以在子类中执行getProperty(“somekey”)
,它将使用父类的实现,但对于文件名,将使用一个私有字段文件名
,该值由父类(字符串文件名)
的新构造函数设置。因此,只有您的第一个代码片段没有真正的帮助。但是谢谢你的建议!