2015-03-20 2 views
0

Учитывая эти классы:Java - Возвращайтесь различные классы детей на основе входных параметров

public class VersionVOV1 extends BaseVO { 

    private String fieldOne = null; 

    public String getFieldOne() { 
     return fieldOne; 
    } 
    public void setFieldOne(String fieldOne) { 
     this.fieldOne = fieldOne; 
} 

public class VersionVOV2 extends BaseVO { 

    private String fieldFour = null; 

    public String getFieldFour() { 
     return fieldFour; 
    } 
    public void setFieldFour(String fieldFour) { 
     this.fieldFour = fieldFour; 
    } 

} 

public class BaseVO { 

    // common code here 

} 

У меня есть метод doSomething вызова, который возвращает конкретный дочерний класс, основанный на входной строки:

public BaseVO doSomething(String version) { 

    BaseVO versionVO = doSomethingVersioned(createVersionVO(version)); 

    return versionVO; 
} 

Остальные методы:

private BaseVO createVersionVO(String version) { 

    BaseVO versionVO = null; 

    if (version.equalsIgnoreCase("V1")) { 

     versionVO = new VersionVOV1(); 

    } else if (version.equalsIgnoreCase("V2")) 

     versionVO = new VersionVOV2(); 

    return versionVO; 
} 

protected VersionVOV1 doSomethingVersioned(VersionVOV1 versionVO) throws Exception { 

    versionVO.setFieldOne("The versionVO is of type: " + versionVO.getClass()); 
    versionVO.setFieldTwo("Field two"); 
    versionVO.setFieldThree("Field three"); 

    return versionVO; 

} 

protected VersionVOV2 doSomethingVersioned(VersionVOV2 versionVO) throws Exception { 

    versionVO.setFieldOne("The versionVO is of type: " + versionVO.getClass()); 
    versionVO.setFieldThree("Field three"); 
    versionVO.setFieldFour("Field four"); 

    return versionVO; 

} 

Как вы можете видеть, я переопределил doSomethingVersioned, чтобы взять определенный дочерний класс. Моя проблема, однако, связана с ошибкой компиляции, которая выглядит так: doSomethingVersioned: Метод doSomethingVersioned (VersionVOV1) в типе VersionExample не применим для аргументов (BaseVO).

Я попытался возвращающая тип <T extends BaseVO> из createVersionVO но я получаю другие ошибки компиляции в этом методе с указанием несоответствия типов: невозможно преобразовать из VersionVOV1 до Т.

Я чувствую, что это должно быть проще, чем я это делаю. Как я могу сохранить этот общий шаблон, но разрешить это скомпилировать?

Спасибо всем, кто помогает!

+2

Использование дженериков! Они твой друг! – StackFlowed

ответ

0

Что вы хотите, это шаблон Factory Method. Примечание: здесь нет никакой пользы от простоты. Вы просто создаете что-то, то презумпция в том, что он пойдет дальше. Дженерики обычно приносят наибольшую выгоду, когда вы хотите использовать код, который ортогонален объектам домена, например. коллекции.

+0

Ну, не фабричный метод, по существу, то, что у меня с моим методом createVersionVO? Я передаю конкретную версию класса, который я хочу, и возвращаю его. – risingTide

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