2017-05-31 23 views
2

私はこの状況にあります:実行時オブジェクト型に基づいてメソッド/コードを実行しています

私は抽象クラスを持っています。 アプリケーションの別の部分では、Aオブジェクトのリストがあります。リスト内のオブジェクトの実際のタイプに基づいて、いくつかの操作を行う必要があります。 例

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 

abstract class A{ 
    abstract void op(); 
} 

class B extends A{ 
    void op(){ 
     System.out.println("b"); 
    } 
    void opB(){ 
     System.out.println("it's b again!"); 
    } 
} 

class C extends A{ 
    void op(){ 
     System.out.println("c"); 
    } 
    void opC(){ 
     System.out.println("it's b again!"); 
    } 
} 

class Ideone 
{ 
    public static void doStuff(B b){ 
     b.opB(); 
     //Some operation unique to class B 
    } 

    public static void doStuff(C c){ 
     //some operation unique to class C 
     c.opC(); 
    } 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     List<A> l = someMethodThatGivesMeTheList(); 
     for(A a: l){ 
      //Here it should use the right 
      doStuff(a); 
     } 
    } 
} 

としての例ではコンパイルが、私は何をしたいのかを説明していません。どうやって?

私はVisitorパターンを適用する可能性しか見つけませんでしたが、それはビジターを受け入れるようにクラスAとそのサブクラスを変更する必要があるため、避けたいと思います。

getClass()を使用し、\ ifが不器用な場合は、私が探しているものではありません。

私は2つの静的メソッドを使用しましたが、いくつかの新しいクラス、ラッパー、すべてが問題を解決する限り使用できます。コードを完全に制御できます。

ここでも同様の質問はCalling method based on run-time type insead of compile-time typeですが、私の場合はJavaで作業しているので、私の問題を解決するためにはdynamic型が存在しません。

編集:これを明確にするためにコメントに書いた内容をここに書きます。実際のデータ型に基づくGUIの作成のように、分離しなければならないものを表すため、操作はAのメソッドにはなりません。ラッパーとしては並列階層が可能ですが、実際のオブジェクトに基づいて適切なGUIオブジェクトを作成する必要がありますが、この同じ問題に戻るか、少なくとも私にとってはそうです。

EDIT 2(リターン):実際のクラスに基づいて行う必要があることをよりよく示すために、少し例を変更しました。これは私のケースから何とか離れているが、問題は同じですが、コレクションは、実際のオブジェクトのクラスを消去し、私は賢くinstanceofgetClass()

+0

'Cクラスに固有の操作 'を' C#op'に移動し、動的ディスパッチを使用します。 –

+0

私の場合はビューとモデルの分離に違反しますが、 '/ /クラスCに固有の何らかの操作は、この場合、データを操作するGUI要素の作成であり、BとCは異なるデータ型です同じインターフェース(A)を共有します。 – bracco23

答えて

1

[コマンドデザインパターン

interface A{ 
    void op(); 
} 

    class C implements A { 
    public void op() { 
     System.out.println("class c command method"); 
    } 
} 

class B implements A { 
    public void op() { 
     System.out.println("class B command method op"); 
    } 
} 

class D implements A { 
    public void op() { 
     System.out.println("class D method op"); 
    } 
} 

public class CommandDemo { 
    public static List produceRequests() { 
     List<A> list = new ArrayList<>(); 
     queue.add(new B()); 
     queue.add(new C()); 
     queue.add(new D()); 
     return list; 
    } 



    public static void main(String[] args) { 
     List list= produceRequests(); 
     for (Object command : list) { 
      ((A)command).execute(); 
     } 
    } 
} 
を確認しましたことを、それを回復するための方法が必要です

出力

class B command method op 
class C command method 
class D method op 
+0

答えをありがとう、不本意にこれは私が欲しいものではありません。私はオブジェクトの種類に基づいて異なるものをしたいが、それらのクラスの中には何も書き込まない。たぶん私はそれを明確に公開していない、私は質問を編集します。 – bracco23

関連する問題