2017-11-12 2 views
1

私はそれを実装する2つのクラスと2つのメソッドを持っています。1つはパラメータとしてファーストクラスのオブジェクトを取得し、もう1つはメソッドを取得します。私はオブジェクトの両方の型を含むベクトルを持っている、私は各ベクトル要素がどのような型がわからないので、型をキャストすることなく、各要素に3番目の関数のメソッドを使用したい。どうやってやるの?これはコードです:このメソッドは引数には適用されません

public interface Transport { 
} 

public class Car implements Transport { 
} 

public class Bike implements Transport { 
} 

public class Operation { 
    public void operation(Car c) { 
     System.out.println("1"); 
    } 

    public void operation(Bike b) { 
     System.out.println("2"); 
    } 

そしてメインに、私はこれを持っている:、このコードは、私がやったことの簡易版である

Transport[] t = new Transport[3]; 
t[0] = new Car(); 
t[1] = new Bike(); 
t[2] = new Car(); 
Operation op = new Operation(); 
op.operation(t[0]); // here I get the error - method not applicable for arguments 

読みやすいようにするためには、だけでなく、そこにあります3つの要素があり、それらはどの入力が得られるかに基づいてforループで作成されます。

+1

Transportクラスにoperation()メソッドを置き、CarおよびBikeでオーバーライドします。これが多形性についてです: 't [0] .operation()'。名前を 'move()'に変更し、トランスポートインターフェースの名前を 'Vehicle 'に変更してその概念を理解してください。 –

答えて

5

コンパイラが式の実行時の型を認識していない場合に、メソッドのオーバーロードを使用しようとしています。

具体的には、t[0]CarまたはBikeであるかどうかをコンパイラが認識しないため、エラーが発生します。

あなたはコールを反転させることによってこの問題を解決することができ、次のように今、あなたが電話をかけることができ

public interface Transport { 
    void performOperation(Operation op); 
} 

public class Car implements Transport { 
    public void performOperation(Operation op) { op.operate(this); } 
} 

public class Bike implements Transport { 
    public void performOperation(Operation op) { op.operate(this); } 
} 

を::Transportoperateを呼び出し、代わりにそれを呼び出すメソッドを与える

Transport[] t = new Transport[3]; 
t[0] = new Car(); 
t[1] = new Bike(); 
t[2] = new Car(); 
Operation op = new Operation(); 
t[0].performOperation(op); 

この技術は一般にVisitor Patternとして知られています。

+0

@ davidxxx同じ構造でどのように混ざっているのかわかりません。「運送」は訪問可能ですが、「運行」は訪問者です。 – dasblinkenlight

+0

あなたの方法は訪問者パターンの特定の形式です:)実際には、訪問者の実装の背後にあるインターフェイスを見逃して、訪問された要素が訪問者の実装を受け入れることができないということです。再び、良い例です。 – davidxxx

関連する問題