加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 当对象是基类的实例时,为对象调用正确的方法

发布时间:2020-12-15 04:33:05 所属栏目:Java 来源:网络整理
导读:我在 Java中有以下示例: public abstract class Vehicle { private final String name; private final String make; public Vehicle(final String name,final String make) { this.make = make; this.name = name; }}public final class Car extends Vehicl
我在 Java中有以下示例:

public abstract class Vehicle {
    private final String name;
    private final String make;

    public Vehicle(final String name,final String make) {
        this.make = make;
        this.name = name;
    }
}

public final class Car extends Vehicle {
    public Car(final String name,final String make) {
        super(name,make);
    }
}

public final class Truck extends Vehicle  {
    final Integer grossVehicleWeight;

    public Truck(final String name,final String make,final Integer gvw) {
        super(name,make);
        this.grossVehicleWeight = gvw;
}

说我想用车做一些工作,而且工作不依赖于车辆的子类.所以,我在另一个类中有一个方法,如下所示:

public void doStuff(public final Vehicle vehicle) {
    //do stuff here
    //then insert it into my database:
    insertVehicle(vehicle);
}

但是,我想在insertVehicle中做不同的事情,所以我为每个子类重写该方法:

public void insertVehicle(Car car) { //do stuff for a car }

public void insertVehicle(Truck truck) { //do stuff for a truck }

在我的doStuff方法中,我可以使用instanceOf来确定车辆的类别(Car或Truck),然后将车辆投射到该类并调用insertVehicle方法,如下所示:

public void doStuff(public final Vehicle vehicle) {
    //do stuff here
    //then insert it into my database:
    if (vehicle instanceof Car) {
        insertVehicle((Car) vehicle);
    } else {
        insertVehicle((truck) vehicle);
    }
}

但是,我已经读过使用instanceof不是最好的方法. 1

我怎么能最好地重做这个以便我不必使用instanceof?

解决方法

您可以使用访客模式:

public interface VehicleVisitor {
    public void visit(Car car);
    public void visit(Truck truck);
}

public class Car extends Vehicle {

    @Override
    public void insert(VehicleVisitor vehicleVisitor) {
        vehicleVisitor.visit(this);
    }
}

public class Truck extends Vehicle {
    @Override
    public void insert(VehicleVisitor vehicleVisitor) {
        vehicleVisitor.visit(this);
    }
}

public abstract class Vehicle {
    public abstract void insert(VehicleVisitor vehicleVisitor);
}

public class VehicleVisitorImpl implements VehicleVisitor {

    @Override
    public void visit(Car car) {
        System.out.println("insert car");
    }

    @Override
    public void visit(Truck truck) {
        System.out.println("insert truck");
    }
}

public class Main {

    public static void main(String[] args) {
        Vehicle vehicle = new Car();
        // finally the agnostic call
        vehicle.insert(new VehicleVisitorImpl());
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读