0

我有以下三个课程。

SuperClass.java
SubClass1 extends SuperClass
SubClass2 extends SuperClass

我有一个方法可以接受 type 的方法参数SuperClass

getResult(SuperClass request){
//Here the request can be of SubClass1 type or SubClass2 type.

}

这里request可以是SubClass1类型或SubClass2类型。

getResult()基于请求类型的内部方法我需要做一些逻辑。

要找出类型,我可以使用instanceof如下运算符。

if(request instanceof SubClass1){
//do something
}else if(request instanceof SubClass2){
//dosomething
}

有没有最好的方法来找出请求的类型?

谢谢!

4

4 回答 4

2

尽量避免instanceof关键字。

不鼓励使用 instanceof 的原因是它不是 OOP。对象的调用者/用户应该没有理由知道它是哪个具体类的实例,超出了它声明的变量的类型。如果您需要子类中的不同行为,请添加一个方法并以不同方式实现它们。

基本方式:我会写如下内容:

enum Types{ SUB_1, SUB_2 }

public class SubClass1 extends SuperClass{
  public Types type = Types.SUB_1;
} 

public class SubClass2 extends SuperClass{
  public Types type = Types.SUB_2;
} 

和:

if(Types.SUB_1 == request.type){
  //do something
}else if(Types.SUB_2 == request.type){
  //do something
}

正确的方式(从我看来)我会在你的情况下使用多态性。

多态性 - 发送给不同对象的相同消息导致行为取决于接收消息的对象的性质。

方法:

 public interface SuperClassItf{
  public void doStuff();
 }

 public class SubClass1 extends SuperClassItf{
     public void doStuff(){
          // do 1
       }
    } 

    public class SubClass2 extends SuperClassItf{
     public void doStuff(){
        // do 2
     }
    } 

主要的

getResult(SuperClassItf request){
   request.doStuff(); //polymorphic method call
}
于 2013-10-17T07:27:13.170 回答
0

为什么不将 getResult() 放在接口中,让逻辑在抽象的 SuperClass 具体子类中执行?

public interface ResultProvider {
    public Result getResult();
}

public abstract class SuperClass implements ResultProvider {
    ...
}

public SubClass1 extends SuperClass {
    public Result getResult() {
        ...
    }
}

public SubClass2 extends SuperClass {
    public Result getResult() {
        ...
    }
}
于 2013-10-17T07:29:41.530 回答
0

另一种方法是具有运行时多态性。这是给你的示例代码。

public class SuperClass
{
public void doSomething(){}
}
public class SubClass1 extends SuperClass{
  public void doSomething(){}
} 

public class SubClass2 extends SuperClass{
  public void doSomething(){}
}

getResult(SuperClass request){

 request.doSomething();

}
于 2013-10-17T07:31:31.277 回答
0

从我的评论:

不鼓励使用 instanceof 的唯一原因是因为它表明未正确利用多态行为,并且有点像非 OO 编程。但这并不意味着您永远不必使用它,在某些条件下您可以使用它。

运行时多态性

现在您可以利用覆盖(运行时多态性),这是一种正确的做事方式。

abstract class SuperClass{
   public abstract Result getResult();
}

class SubClass1 extends SuperClass{
   @Override
   public Result getResult(){
      //logic
   }
}


class SubClass2 extends SuperClass{
   @Override
   public Result getResult(){
      //logic
   }
}

//calling 

getResult(SuperClass request){
   Result r = request.getResult();
}
于 2013-10-17T07:39:38.490 回答