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 に答える