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()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |