如何实现更好的OOP

时间:2015-05-05 08:40:07

标签: java oop selenium

我正在开发一个selenium WebDriver框架[Java],其中有一个Base类,其他所有类都从这个类扩展而来。此外,我遵循页面对象模型,其中每个页面对应于一个类和方法,其中导航到下一页返回下一页/类的新实例。简而言之,每个UI页面对应于Class

现在每个页面都有一些共同的功能,所以不要把它们放到每个类中,而是避免DRY我把它放在我的Base Page类中

for go goBack方法在每个页面上,基本上导航到上一页。

我担心的是我想跟随页面/类之间的链接,因此我不确定什么应该是前goBack的常用方法的返回类型。

请记住导航到下一页的任何方法都应该返回该页面的新实例。

我认为一个解决方案是实现泛型,但仍然在苦苦挣扎。任何人都可以帮助我如何实现这一目标。

public class BasePage {
            public WebDriver driver;
            public BasePage(WebDriver driver) {
                this.driver=driver;
            }
            public BasePage clickGoBack() throws Exception{
            driver.click(goBackButton);
            return this;
            }
       }

1 个答案:

答案 0 :(得分:7)

BasePage需要知道链接的实现类型:

/**
 * @param <T> The implementing type.
 */
public abstract class BasePage<T extends BasePage<T>> {}

然后,您可以使用:

public T clickGoBack() { return (T) this; }

这里的问题是,this不一定是T的一个实例,所以演员阵容不安全,例如使用以下类:

public class Page1 extends BasePage<Page2> {}

解决方案是询问子类this

public abstract class BasePage<T extends BasePage<T>> {

  protected final WebDriver driver;

  public BasePage(WebDriver driver) {
    this.driver = driver;
  }

  public T clickGoBack() throws Exception{
    driver.click(goBackButton);
    return getThis();
  }

  protected abstract T getThis();

}

public class HomePage extends BasePage<HomePage> {

  public HomePage(WebDriver driver) {
    super(driver);
  }

  @Override
  protected HomePage getThis() {
    return this;
  }

}