2015-11-22 2 views
0

Есть ли способ генерации объектов разных типов из одного метода без использования длинных и сложных if-операторов?Создание разных объектов по одному методу

Допустим, я создал абстрактный класс под названием Vehicle. Автомобиль имеет конструктор, как это:

public abstract class Vehicle { 
    int mileage; 

    public Vehicle (int mileage) { 
    this.mileage = mileage; 
    } 
} 

Теперь, я создал много и много различных типов транспортных средств, которые все наследуется автомобиля, такие как багги, SmallCar, MediumCar, BigCar, FastCar, OldCar, NewCar, PickUpTruck , SmallTruck, MediumTruck, LargeTruck, Велосипед, Трамвай, Поезд и т. Д. И так далее. Насколько я понимаю, они теперь все Транспортные средства, поскольку они наследуют Автомобиль.

Можно ли каким-либо образом получить тип автомобиля у пользователя вместе с пробегом и создать правильный тип транспортного средства, передав его одному методу независимо от того, какой тип транспортного средства выбрал пользователь? Что-то вроде этого:

public void createNewVehicle (Variable someKindOfWayToPickVehicleType, int mileage) { 
    // Create a new vehicle where exact class is decided by someKindOfWayToPickVehicleType variable 
} 
+1

См. Http://stackoverflow.com/questions/9174359/create-different-objects-depending-on-type – jarmod

+0

Используйте «перечисление», если у вас есть фиксированное количество транспортных средств. Каждый элемент в 'enum' может иметь собственный метод« create », который вернул правильный тип транспортного средства – MadProgrammer

+0

http://stackoverflow.com/a/29853592/180100 является опцией –

ответ

0

Это решило проблему для меня:

public static Car createCar(Class model, int mileage) { 
    try { 
     Object o = Class.forName(model.getName()) 
       .getConstructor(int.class) 
       .newInstance(mileage); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return (Car)o; 
} 

Если у кого есть замечания или пожелания по этому подходу я всегда готов учиться.

Смежные вопросы