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 中跨子类的工作方式。我们有一个争论......我的意思是讨论......关于这个的另一个帖子在这里的某处。

但无论如何,我认为最干净的解决方案是:

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 值,那么将 getXpath 函数放在 A 抽象中。然后,如果您忘记在子类中实现它,您将收到编译时错误。

于 2012-05-08T17:19:58.790 回答
0

你真的有两个选择:

  1. 在基类中有一个变量,并添加一个受保护的 setter 方法,以便子类可以将其设置为新值
  2. 根本没有变量,并覆盖每个子类中的方法,以便它返回正确的字符串。

我推荐解决方案 2 - 通过覆盖方法来解决

于 2012-05-08T17:19:17.530 回答