如何实现更好的OOP

Sun*_*eva 5 java oop selenium

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

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

对于前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;
            }
       }
Run Code Online (Sandbox Code Playgroud)

sp0*_*00m 7

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

/**
 * @param <T> The implementing type.
 */
public abstract class BasePage<T extends BasePage<T>> {}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用:

public T clickGoBack() { return (T) this; }
Run Code Online (Sandbox Code Playgroud)

这里的问题是,this它不一定是一个实例,T因此强制转换不安全,例如使用以下类:

public class Page1 extends BasePage<Page2> {}
Run Code Online (Sandbox Code Playgroud)

一个解决方案是询问子类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;
  }

}
Run Code Online (Sandbox Code Playgroud)