2012-10-24 7 views
20

私は抽象クラスVehicleに2つの実装サブクラスRedVehicleYellowVehicleを持っています。サブクラスをメソッドに渡しますが、スーパークラスをパラメータとして使用していますか?

私は、両方のサブクラスのインスタンスを含むList<Vehicle>を持っています。 メソッドにクラス型を渡して、その型を使用して、Listで何かを実行したいオブジェクトのセットを決定したいと考えています。 Class以来

は、私はしかし、exampleMethod以来取り組んで呼び出し元のコードは、現在の車両の種類、ないRedVehicleあるいはYellowVehicleのサブクラスを期待して停止しVehicle親クラスとしてパラメータを入れて、何かでそれをparameteriseする必要があり、一般的なです。

これを行うにはクリーンな方法が必要だと思いますが、その機能を実装する正しい方法は何でしょうか?

n.b.私は必ずしもClass型を渡す必要はありませんが、より良い提案があれば、それらを試してみてうれしいです。

電話番号:

​​3210

フィールド/メソッド:

//List of vehicles 
//Vehicle has 2 subclasses, RedVehicle and YellowVehicle 
private List<Vehicle> vehicles; 

//Having <Vehicle> as the Class parameter stops the calling code working 
public void exampleMethod(Class<Vehicle> type) 
{ 
    for(Vehicle v : vehicles) 
    { 
     if(v.getClass().equals(type)) 
     { 
      //do something 
     } 
    } 
} 

答えて

41

ではなく、これを実行します。

public <T extends Vehicle> void exampleMethod(Class<T> type) 
+0

public interface Visitor { visitRedVehicle(RedVehicle red); visitYellowVehicle(YellowVehicle yellow); } 

訪問者を使用します。戻り値の型の前にジェネリック型を持つための特別な名前はありますか?一般的なソースへのリンクは良いでしょうか?私は試してみて明日、それがうまくいくならば受け入れます。 – Peanut

+1

は、oracleのジェネリックの紹介やangelika langerのjava genericsのFAQを見てください。 +1はmprivatの直接的な解決方法です。 – DaveFar

+0

@DaveBall angelika langer suggesetionのおかげで、私はジェネリックをコンセプトとして認識していますが、それを使ったことはありませんでしたが、深く掘り下げたことはありませんでした。関心のある人のためのリンク:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQhtmlの – Peanut

4

はなぜvisitor patternを使用していませんか?あなた

  • タイプのトークンを必要としない

    その方法は

  • ダイナミックディスパッチは、(代わりにif(v.getClass().equals(type))の)大文字小文字の区別を処理させる

OCP次)、より柔軟です

詳細:

抽象クラスVehicleは、のメソッドを取得し、サブクラスはvで適切なメソッドを呼び出すことでそれを実装します。私はそれが簡単なものになるだろう知っていた

public class Example { 

    public void useYellowOnly() { 
    exampleMethod(new Visitor() { 
     visitRedVehicle(RedVehicle red) {}; 
     visitYellowVehicle(YellowVehicle yellow) { 
      //...action 
     }); 
    } 
    public void exampleMethod(Visitor visitor){ 
     for(Vehicle v : vehicles) { 
      v.accept(visitor); 
     } 
    } 
} 
関連する問題