我们可以在JAVA中使用if else返回不同​​的类对象吗?

时间:2018-01-10 11:40:08

标签: java

我正在为一个网页编写一个自动化测试,其中一个步骤对于不同的身份验证类是常见的,并且在单击下一个按钮后,第二个步骤将针对每个身份验证类进行更改。

选择身份验证类的公共类:

class CreateClassStep1 {
    ///some code
    public ? nextButton() {
        nexbutton.click()
    }
}

现在假设有四个身份验证类ABCD。该函数应根据所选的身份验证类返回。

那怎么可能呢?是否可以使用if-else返回不同类型的对象?

3 个答案:

答案 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)

您可以通过以下方式实现

  1. 通过使用新的Parent类/接口扩展A,B,C和D类,并将返回类型作为该Parent类。

  2. 将返回类型设为Object

  3. 使用generics

  4. 对于所有这些方式,在接收端,您必须将返回类型强制转换为更正类。为此,您可以获得instanceOf

    的帮助