Вызов метода объекта в HashMap в Java - PullRequest
0 голосов
/ 26 октября 2011

У меня 2 класса: грузовик и седан.Когда происходит какое-то действие, я хочу добавить седан в hashMap в классе Truck.Карта показывает, какие седаны в настоящее время находятся в грузовике грузовика.Я не хочу, чтобы Truck и Sedan знали друг о друге, поэтому я создал в CarManager метод, который может вызывать Sedan, который передает идентификатор седана и идентификатор Truck, к которому хочет добавить седан.Затем CarManager сообщит Truck, что седан хочет быть добавленным в список.Проблема в том, что я не знаю, как CarManager сообщит Truck и что я должен иметь в этом методе addSedan.У меня есть HashMap в CarManager, который имеет коллекцию CarEntities.CarManager не может получить доступ к методу 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");
}

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Если вы не можете использовать приведение типов и 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);
}
0 голосов
/ 26 октября 2011

Ответ зависит от того, кто выполняет действие. Если Sedan добавляют себя в грузовик, то у вас должен быть метод addTruck, который добавляет все грузовики в менеджера. Менеджер будет хранить Truck s в 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);
}

Если вместо этого грузовики забирают машины, вы можете зарегистрировать их. Если вам нужно, чтобы оба были по строковому идентификатору, вам нужно зарегистрировать как легковые, так и грузовые автомобили и сделать что-то вроде:

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. В этом случае, возможно, менеджер уходит.

0 голосов
/ 26 октября 2011

Я думаю, одна вещь, которую вы можете сделать, это

CarEntity t = hash.get(truckId); 
if (t instanceof Truck)
   downcast car entity to truck
   call add car method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...