2016-03-31 22 views
0

Soyut bir üst sınıftan bir dizi üzerinde bir soyut sınıftan oluşan bir sınıftan belirli bir yöntemi çağırmaya çalışıyorum. Bunu yapmak için herhangi bir olasılık var mı? Eğer users[findUser(userName)] sonucu her zaman belirli türden olduğunu biliyorsanızDizideki sınıflardan genişletilmiş sınıflardan yöntem çağırma yöntemleri

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

Başa çıkmaya çalıştığınız arabirim nedir? – ifly6

+0

'AbstractClassExtension.method (super.array)'? Ama kesin veri yapısının ne olduğunu bilemezsek, doğru bir şansımız yoktur. – ifly6

cevap

0

bunu yapabilirsiniz:

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

Aksi takdirde arama yapmadan önce instanceof belli tip test etmek gerekecek.

Tüm bunlardan kaçınmak için, yapabileceğiniz en iyi şey ziyaretçi modelini uygulamaktır. Bu nasıl olabilir: Artık

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()); 
} 

, ben sadece kısaltmak için örnek bir kişi ziyaret var, ancak bunların her farklı kullanıcı türlerine farklı şeyler yapıyor, ziyaretçilerin birden fazla türde olabilir.

İlgili konular