2016-03-31 26 views
0

抽象クラスを拡張するクラスから抽象スーパークラスの配列に特定のメソッドを呼び出そうとしています。それを行う可能性はありますか?抽象クラスからの配列の拡張クラスからメソッドを呼び出す

users[findUser(userName)].setVehicle(vehicles[counterVehicles]) 
+0

対処しようとしているインターフェイスは何ですか? – ifly6

+0

'AbstractClassExtension.method(super.array)'?しかし、正確なデータ構造が何であるかわからない限り、正しいことはありません。 – ifly6

答えて

0

あなたがusers[findUser(userName)]の結果は常に、あなたがこれを行うことができ、特定のタイプのあることがわかっている場合:

((ConcreteUser)users[findUser(userName)]).setVehicle(vehicles[counterVehicles]) 

そうでない場合は、あなたが電話をかける前にinstanceof特定のタイプでテストする必要があります。

これをすべて避けるには、ビジターパターンを実装することをおすすめします。これは、それができるかです:今

interface UserVisitor { 
    public void visit(ConcreteUser1 user1); 

    public void visit(ConcreteUser2 user2); 
} 


static class VehicleVisitor implements UserVisitor { 

    private Vehicle vehicle; 
    private Bus bus; 

    VehicleVisitor(Vehicle vehicle, Bus bus) { 
     this.vehicle = vehicle; 
     this.bus = bus; 
    } 

    public void visit(ConcreteUser1 user1) { 
     user1.setVehicle(vehicle); 
    } 

    public void visit(ConcreteUser2 user2) { 
     user2.setBus(bus); 
    } 
} 

static abstract class AbstractUser { 
    public abstract void accept(VehicleVisitor visitor); 
} 

static class ConcreteUser1 extends AbstractUser { 

    private Vehicle vehicle; 

    public void accept(VehicleVisitor visitor) { 
     visitor.visit(this); 
    } 

    public void setVehicle(Vehicle vehicle) { 
     this.vehicle = vehicle; 
    } 

    public Vehicle getVehicle() { 
     return vehicle; 
    } 
} 

static class ConcreteUser2 extends AbstractUser { 

    private Bus bus; 

    public void accept(VehicleVisitor visitor) { 
     visitor.visit(this); 
    } 

    public void setBus(Bus bus) { 
     this.bus = bus; 
    } 

    public Bus getBus() { 
     return bus; 
    } 
} 

static class Vehicle { 

    @Override 
    public String toString() { 
     return "CAR"; 
    } 
} 
static class Bus { 

    @Override 
    public String toString() { 
     return "BUS"; 
    } 
} 

public static void main(String[] args) { 
    List<AbstractUser> users = new ArrayList<AbstractUser>(); 
    ConcreteUser1 user1 = new ConcreteUser1(); 
    users.add(user1); 
    ConcreteUser2 user2 = new ConcreteUser2(); 
    users.add(user2); 

    for (AbstractUser user : users) { 
     VehicleVisitor visitor = new VehicleVisitor(new Vehicle(), new Bus()); 
     user.accept(visitor); 
    } 

    System.out.println(user1.getVehicle()); 
    System.out.println(user2.getBus()); 
} 

、私はそれを短くする例の1人の訪問者を持っていますが、あなたはそれらのそれぞれが、異なるタイプのユーザに異なることをやって、来場者の複数のタイプを持つことができます。