从抽象类调用数组上的扩展类的方法

时间:2016-03-31 21:48:41

标签: java arrays class abstract

我试图从一个扩展抽象类的类中调用某个方法,在抽象超类的数组上调用。有没有可能做到这一点?

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

1 个答案:

答案 0 :(得分: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());
}

现在,我在示例中只有一个访问者缩短了时间,但是您可以拥有多种类型的访问者,每个访问者都会针对不同类型的用户执行不同的操作。