有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个参数的java接口

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

类中方法的几个存根如下所示,但它们的参数更多:

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()方法

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您可以创建参数化界面:

    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() {
    
        }
    }