2015-12-29 4 views
0

У меня есть следующий метод build, определенный в другом классе, который в основном использует два класса PD.java и SD.java, как указано ниже. Код метода заключается в следующем:Доступ к методам, которые не определены

protected String build(final PD pd) { 
    if (pd == null || pd.getField() == null) { 
     return null; 
    } else { 
     return " ORDER BY " + pd.getFieldName() + ' ' + pd.getDirection().getCommand(); 
    } 
    } 

Мои вопросы:

Как показано на PD.java ниже, он getDirection() метод, определенный в нем, но не getCommand(). Метод getCommand() определен в SD.java. Следовательно, мне интересно, если в приведенном выше методе build следующий способ доступа к методу правильный или нет?

pd.getDirection().getCommand();

Пожалуйста, обратите внимание на следующие классы:

Класс Имя: SD.java

public enum SD implements MappableEnum<SD> { 

    ASCENDING("A", "Ascending", "ASC"), 
    DESCENDING("D", "Descending", "DESC"), 

    ; 

    private final String code; 
    private final String description; 
    private final String command; 

    private static final Map<String, SD> CODE_MAP = 
    MappableEnumUtil.buildCodeMap(SD.class); 

    private SD(final String code, final String description, final String command) { 
    this.code = code; 
    this.description = description; 
    this.command = command; 
    } 

    @JsonValue 
    @Override 
    public String getCode() { 
    return code; 
    } 

    @Override 
    public String getDescription() { 
    return description; 
    } 

    @Override 
    public SD toEnum(final String code) { 
    return fromCode(code); 
    } 

    public String getCommand() { 
    return command; 
    } 

    @JsonCreator 
    public static SD fromCode(final String code) { 
    return CODE_MAP.get(code); 
    } 

    public static SD fromCode(final char code) { 
    return fromCode(String.valueOf(code)); 
    } 

} 

Название Класс: PD.java

public class PD<F extends SF> { 

    private final F field; 

    private final Integer limit; 

    private final Integer offset; 

    private final SD direction; 

    public PD(final F field, final Integer limit, final Integer offset, final SD direction) { 
    this.field = field; 
    this.limit = limit; 
    this.offset = offset; 
    this.direction = direction; 
    } 

    public F getField() { 
    return field; 
    } 

    public String getFieldName() { 
    return field.getColumnName(); 
    } 

    public Integer getLimit() { 
    return limit; 
    } 

    public Integer getOffset() { 
    return offset; 
    } 

    public SD getDirection() { 
    return direction; 
    } 
} 
+0

Скомпилирует? –

+0

@MiserableVariable Да, это так. ошибок компиляции нет. Вы видите что-то не так с вышеуказанным кодом? – John

+0

Извините, я сначала неправильно прочитал код. Кажется прекрасным, сталкиваются с какими-либо проблемами? SD - это общий класс, но вы не зависите от параметра типа, поэтому он должен быть в порядке. (подсказка: для публикации вопроса попробуйте создать наименьший образец кода, который демонстрирует проблему.) –

ответ

1

Поскольку тип SD является переменной в классе PD, тогда он может получить доступ к любым общедоступным методам, которые определены для класса SD. Если видимость метода в SD не является общедоступной, то он не сможет получить доступ к этому методу.

+0

Но в 'pd.getDirection(). GetCommand();' метод 'getDirection()' обращается к объекту класса PD, 'pd', что имеет смысл, однако метод' getCommand() ' определенный внутри класса SD, так что это законно для доступа к нему, как это 'pd.getDirection(). getCommand();'? – John

+0

Да, поскольку все, что является экземпляром PD, также является экземпляром SF, таким как эффект полиморфизма. – Untitled123

+0

Почему вы включаете SF здесь. Я считаю, что это не имеет никакого отношения к моему вопросу, поскольку 'getDirection()' принадлежит классу PD, а 'getCommand()' принадлежит классу SD. Или вы имели в виду сказать, что, поскольку у меня есть «частное окончательное направление SD», определенное внутри класса PD, я могу получить доступ к любым методам класса SD так же, как мой вопрос? – John

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