首页 > 解决方案 > 与多个参数的接口

问题描述

我创建了一个实用程序类,它有一些检查网页元素的方法。现在是时候重构这些方法,使它们属于自己的类,以便我可以传递它们。

下面是类中方法的几个存根,但它们还有更多具有不同参数的存根:

public boolean checkElementExistsByText(String key, String text) {}

public boolean checkElementText(String key, Predicate<String> predicate) {}

public boolean checkElementText(WebElement element, Predicate<String> predicate){}

我尝试创建以下界面:

interface CheckElementInterface {

boolean checkElement();

}

我遇到了这个问题,因为我无法在 checkElement 方法中处理多个参数,所以我必须将它们传递给每个实现它的类的构造函数;

public class CheckedElementExistsByText implements CheckElementInterface{
    private final WebElement element;
    private final String text;

    public CheckedElementExistsByText(WebElement element, String text) {
        this.element = element;
        this.text = text;
    }

    @Override
    public boolean checkElement() {

    }

这是最好的方法,还是有一种方法可以将多个参数传递给 checkElement() 方法?

谢谢

标签: javaselenium

解决方案


您可以创建参数化界面:

interface CheckElementInterface<T1, T2> {

 boolean checkElement(T1 elem1, T2 elem2);

}

然后您可以创建实现,例如:

public class CheckedElementExistsByText implements CheckElementInterface<WebElement, String>{

@Override
public boolean checkElement(WebElement element, String text) {

}

编辑

具有参数化接口的方法提出了一个问题,即如何为具体的 T1、T2 获得接口的实现。它需要实现中的附加功能来帮助分派“checkElement”请求。例如

interface CheckElementInterfaceProvider {
    CheckElementInterface<T1, T2> getChecker(T1, T2);
}

和示例用法:

WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement(element, text);  

正如我现在所看到的:checkElementMethod 中不需要参数,因为 CheckElementProvider 可以充当工厂。

WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement();  

并修改了 CheckElementInterface (现在与您的示例几乎相同 - 仅添加了类型参数):

interface CheckElementInterface<T1, T2> {
    boolean checkElement();
}
public abstract class AbstractCheckElement<T1, T2> implements CheckElementInterface<T1, T2>{
    private final T1 e1;
    private final T2 e2;

    public AbstractCheckElement(T1 e1, T2 e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

}


 public class CheckedElementExistsByText implements AbstractCheckElement<WebElement, String>{
     public AbstractCheckElement(WebElement element, String text) {
        super(element, text);
     }
    @Override
    public boolean checkElement() {

    }
}

推荐阅读