0

私は以下の3つのクラスを持っています。

SuperClass.java
SubClass1 extends SuperClass
SubClass2 extends SuperClass

type の method パラメータを受け入れるメソッドがありますSuperClass

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

}

ここで、はtype またはtype のrequestいずれかです。SubClass1SubClass2

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

私のコメントから:

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 に答える