2

想到以下问题的优雅解决方案,我的头很疼。我有一个父类和几个子类。我的父类声明并实现了一个检索属性的方法,但是属性文件的名称是由子类决定的。

我只处理子类的实例。

该方法(在父类中实现)应该使用子类的字段值,但是由于我在父类中使用它,因此我也需要在那里声明它。

现在,每次我从子类调用该方法时,都会使用父类的字段值。

一些简单的代码来说明我的问题(请记住:这与功能无关 - 更多关于设计)。定义我要使用的字段值的子类:

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”)。我用非静态字段得到了同样的效果。

4

3 回答 3

3

查看您的代码,您正在使用Parent.CONFIG_FILE, 在您应该使用的子类中SubClass.CONFIG_FILE

于 2012-10-01T19:32:19.847 回答
2

把它放在你的子类中。这将返回子类的属性。此方法将覆盖父类中的方法。

public String getProperty(String key) {
   return CONFIG_FILE;
 }

顺便说一句,您正在隐藏变量。

或者,我建议将变量名称传递给构造函数,然后让它调用 super。

public SubClass() {
    super(SUB_CLASS_CONFIG);
}

然后让父构造函数类似于

public Parent(String key) { 
     CONFIG_FILE = key;
}

那么您将不必重写该方法。该方法可以只返回父级中的配置。我会仔细考虑你是否希望它是静态的......

于 2012-10-01T19:32:29.123 回答
1

只需getProperty()在子类中覆盖(即实现)。

于 2012-10-01T19:29:03.037 回答