Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用子类的字段执行父方法_Java_Design Patterns_Inheritance - Fatal编程技术网

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”)
,它将使用
父类的实现,但对于文件名,将使用一个私有字段
文件名
,该值由
父类(字符串文件名)
的新构造函数设置。因此,只有您的第一个代码片段没有真正的帮助。但是谢谢你的建议!