使用子类的字段执行父方法

时间:2012-10-01 19:27:29

标签: java design-patterns inheritance

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

我只使用子类的实例。

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

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

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

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”)。我对非静态字段的效果相同。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

将它放在您的子类中。然后,这将返回子类的属性。此方法将覆盖父类中的方法。

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

你很容易shadowing变量。

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

public SubClass() {
    super(SUB_CLASS_CONFIG);
}

然后让Parent construtor像

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

然后你不必重写方法。该方法只能在父级中返回config。我会仔细考虑你是否希望它是静态的......

答案 2 :(得分:1)

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