2

一般的に使用されるメソッドを実装する抽象クラス A を作成しました。ここで、新しいクラスは同じメソッドを使用する必要があることに気付きましたが、属性値は異なります。以下に簡単な要約を示します。

public abstract class A implement IUtils {
  protected final String LOGIN_XPATH = "xpathA";

  public String getLoginName() {
    return getXpath(LOGIN_XPATH);
  }
}

public class B extends A {
  private final String LOGIN_XPATH = "xpathB";
}

B.getXpath() を呼び出すと、スーパー メソッドが呼び出され、"xpathA" が使用されます。「xpathB」を使用したいと思います。クラスAで次の構成を使用することを考えました。

public abstract class A implement IUtils {
  protected IXpaths xpaths = null;

  public A() {
    xpaths = new XPathsClass();
  }  

  public String getLoginName() {
    return getXpath(xpaths.getXpath(StaticString.LOGIN_XPATH));
  }
}

public class StaticString {
  public final String LOGIN_XPATH = "LOGIN_XPATH";
}

public class XPathsClass implements IXpaths {
  private static final Map<String, String> conversionMap = new HashMap<String, String>();

  static {
    conversionMap.put(StaticString.LOGIN_XPATH, "xpathA");
  }

  public String getValue(String query) {
    return conversionMap.get(query);
  }
}

public class XPathsClassB implements IXpaths {
  private static final Map<String, String> conversionMap = new HashMap<String, String>();

  static {
    conversionMap.put(StaticString.LOGIN_XPATH, "xpathB");
  }

  public String getValue(String query) {
    return conversionMap.get(query);
  }
}

public class B extends A {
  public B() {
    super();
    xpaths = new XPathsClassB();
  }
}

これは機能しているように見えますが、非常に長くなり、読みにくくなります。より良い方法は何でしょうか?

4

2 に答える 2

2

ええ、私は静的が Java のサブクラス間で機能する方法があまり好きではありません。私たちは議論をしました...つまり、議論を意味します...これについては、ここSOの別の投稿でどこかにあります。

とにかく、最もクリーンな解決策は次のとおりだと思います。

public abstract class A implement IUtils { 
  public String getXpathValue() {
    return "xpathA";
  }

  public String getLoginName() { 
   return getXpath(getXpathValue()); 
  } 
} 

public class B extends A { 
  public String getXpathValue() {
    return "xpathB";
  }
} 

すべてのサブクラスが独自の Xpath 値を持つ必要がある場合は、A の getXpath 関数を抽象化します。それをサブクラスに実装するのを忘れると、コンパイル時にエラーが発生します。

于 2012-05-08T17:19:58.790 に答える
0

実際には 2 つの選択肢があります。

  1. 基本クラスに変数を持ち、保護されたセッター メソッドを追加して、サブクラスが新しい値に設定できるようにします
  2. 変数をまったく持たず、各サブクラスでメソッドをオーバーライドして、正しい文字列を返すようにします。

解決策2をお勧めします-メソッドをオーバーライドして解決します

于 2012-05-08T17:19:17.530 に答える