我有两个班:卡车和轿车。当某些动作发生时,我想在Truck类的hashMap中添加一个轿车。地图说明了轿车目前在卡车的货物中的含义。我不希望卡车和轿车彼此了解所以我在CarManager中制作了一个方法,轿车可以调用它来传递轿车的ID和轿车想要添加到的卡车的ID。然后CarManager将通知Truck,轿车想要添加到列表中。问题是我不知道CarManager将如何通知卡车以及我应该在addSedan方法中拥有什么。我在CarManager中有一个HashMap,它有一个CarEntities集合。 CarManager无法访问Truck的addCar方法,因为它不在界面中,我不想在界面中添加它,因为并非所有CarEntity都会使用它。有人可以帮忙吗?
public interface CarEntity {
String getId();
double getSpeed();
void move();
}
public class CarManager {
private HashMap<String, CarEntity> hash = new HashMap<String, CarEntity>();
public void addSedan(String carId, String truckId) {
???
hash.get(truckId).addCarr(carId); //I don't think this will work
}
}
public class Truck implements CarEntity {
private HashMap<String, CarEntity> cargo = new HashMap<String, CarEntity>();
public void addCar(String id, CarEntity ce) {
cargo.put(id,ce);
}
public class Sedan implements CarEntity {
CarManager.addSedan("Car 1", "Truck 5");
}
答案 0 :(得分:1)
如果你不能使用强制转换和instanceof并且必须使用多态,那么在CarEntity界面中添加两个方法:
boolean canBeLoadedWithCars();
void addCar(CarEntity c) throws IllegalStateException;
卡车可以装载汽车,因此通过返回true来实现第一个方法。其他的都返回false。
addCar
Truck
方法将汽车添加到他们的地图中,而其他实现抛出IllegalStateException,因为它们无法加载汽车。
因此管理器的addCar
方法变为
CarEntity truck = hashMap.get(truckId);
if (truck.canBeLoadedWithCars() {
truck.addCar(sedan);
}
答案 1 :(得分:0)
我猜你可以做的一件事是
CarEntity t = hash.get(truckId);
if (t instanceof Truck)
downcast car entity to truck
call add car method
答案 2 :(得分:0)
答案取决于谁在采取行动。如果Sedan
将自己添加到卡车中,那么您应该使用addTruck
方法将所有卡车添加到经理中。经理会将Truck
存储在Map
。
private Map<String, Truck> trucks = new HashMap<String, Truck>();
public void registerTruck(Truck truck) {
trucks.put(truck.getId(), truck);
}
然后管理器上的addCar()
方法会:
public void addCar(String truckId, CarEntity car) {
Truck truck = trucks.get(truckId);
// null handling needed here
truck.addCar(car);
}
相反,如果卡车拿走了汽车,那么您可以注册汽车。如果您需要两者都是字符串ID,那么您需要注册汽车和卡车,并执行以下操作:
private Map<String, Truck> trucks = new HashMap<String, Truck>();
private Map<String, Sedan> sedans = new HashMap<String, Sedan>();
public void registerTruck(Truck truck) {
trucks.put(truck.getId(), truck);
}
public void registerSedan(Sedan sedan) {
sedans.put(sedan.getId(), sedan);
}
public void addSedan(String sedanId, String truckId) {
Sedan sedan = sedans.get(sedanId);
Truck truck = trucks.get(truckId);
// null handling needed here
truck.addCar(sedan);
}
通常我们使用Java接口来完成解耦。 Truck
类应该能够在不知道它是CarEntity
的情况下向其加载Sedan
。在这种情况下,addCar(CarEntity car)
上的Truck
方法听起来不错。 Sedan
永远不会知道它位于Truck
上,所有卡车都知道通过CarEntity
界面公开的方法。在这种情况下,经理可能会离开。