我正在为一个网页编写一个自动化测试,其中一个步骤对于不同的身份验证类是常见的,并且在单击下一个按钮后,第二个步骤将针对每个身份验证类进行更改。
选择身份验证类的公共类:
class CreateClassStep1 {
///some code
public ? nextButton() {
nexbutton.click()
}
}
现在假设有四个身份验证类A
,B
,C
和D
。该函数应根据所选的身份验证类返回。
那怎么可能呢?是否可以使用if-else
返回不同类型的对象?
答案 0 :(得分:1)
只需使用公共接口或类,您就可以返回然后访问该公共类型的方法,无论实例类型如何(它将是该类型的子类)
一个通用界面
public interface I{
public String getName();
}
这是一个通用接口的两个实现:
public class A implements I{
public String getName(){ return "A"; }
}
public class B implements I{
public String getName(){ return "B"; }
public String otherMethod(){ return "otherValue"; }
}
让我们创建一个简单的Test
类,它将使用返回其中一个实现的方法来保存测试的主要方法:
public class Test{
public static void main(String[] args){ ... }
//return a `I` type
public static I getInstance(int i){
if(i == 0){
return new A();
}else{
return new B();
}
}
}
某些测试看起来像:
I i;
i = getInstance(0); //type A
i.getName(); //A
i = getInstance(1); //type B
i.getName(); //B
这可以像下面这样内联:
getInstance(0).getName(); //A
getInstance(1).getName(); //B
现在,关于方法的可见性,您无法访问未在变量类型中定义的方法。此处变量i
被声明为I
,因此您只有getName()
方法,即使B
的实例存储在其中:
i.otherMethod(); //COMPILE ERROR unknown method
您需要转换实例:
B b = (B) i;
b.otherMethod(); //otherValue
但这是不安全的,你不能将A转换成B,所以它可能会在运行时抛出异常。
仅供参考:我使用了一个界面,因为我需要的是一些方法声明(getName
)。如果要扩展(或抽象类),可以使用类,但要知道一个类只能扩展一个超类。如果您需要从另一个类继承,这可能是一个问题。
答案 1 :(得分:0)
创建一个Stat
接口,然后创建每个State类以实现next
方法。之后,您可以使用全局变量来记录当前状态。
interface State {
State next();
}
每当你需要进入下一个状态时,只需致电
currentState = currentState.next();
答案 2 :(得分:0)
您可以通过以下方式实现
通过使用新的Parent类/接口扩展A,B,C和D类,并将返回类型作为该Parent类。
将返回类型设为Object
使用generics
对于所有这些方式,在接收端,您必须将返回类型强制转换为更正类。为此,您可以获得instanceOf
的帮助