简体   繁体   English

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

[英]Calling methods from extended classes on array from abstract class

I am trying to call a certain method from a class that extendes an abstract class, on a array from the abstract superclass. 我试图在扩展抽象类的类的某个类中调用某个方法,该类来自抽象超类的数组。 Is there any possiblity to do that? 有这样做的可能性吗?

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

if you know that the result of users[findUser(userName)] is always of certain type you can do this: 如果您知道users[findUser(userName)]的结果始终为特定类型,则可以执行以下操作:

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

Otherwise you'll have to test with instanceof certain type before making the call. 否则,您必须在调用之前使用特定类型的instanceof进行测试。

To avoid all this, best thing you can do is implement the visitor pattern. 为了避免所有这些,您最好的办法就是实现访客模式。 This is how could it be: 这是怎么回事:

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

Now, I only have one visitor in the example to make it shorter, but you could have multiple types of visitors, each of them doing different things to different types of users. 现在,在示例中,只有一个访客可以缩短访客的数量,但是您可以有多种访客类型,每个访客对不同类型的用户执行不同的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM