Как вызвать дочерний метод из родительской ссылки? - PullRequest
1 голос
/ 01 июня 2011

У меня есть суперкласс по имени DataItem, в котором много детей, и у детей тоже есть дети. Я динамически устанавливаю тип объекта, но в конце ссылка на тип DataItem. Вот код, который я использую для определения типа класса:

private DataItem getDataItemUponType(DataSection parent,Element el) {
    String style = getItemStyle(parent,el);
    if(style!=null) {
        if(style.equals("DUZ")) {
            return new DataItemPlain();
        } else if(style.equals("TVY")) {
            return new DataItemPaired();
        } else if(style.equals("TVA")) {
            return new DataItem();
        } else if(style.equals("FRM")) {
            return new DataItemForm();
        } else if(style.equals("IMG")) {
            return new DataItemImage();
        } else if(style.equals("CLN")) {
            return new DataItemCalendar();
        } else if(style.equals("BTN")) {
            return new DataItemButton();
        } else if(style.equals("ALT")) {
            return new DataItemSubRibbon();
        }
    } else {    
        // At least return a DataItem.
        return new DataItem();
    }
    return new DataItem();
}

Затем я использую это, чтобы установить мой объект:

DataItem dataItem = getDataItemUponType(parent,element);

Тогда я хочу позвонить из подтипа DataItem. Как мне это сделать?

Примечание: мне нужно использовать DataItem, чтобы сделать его абстрактным, у меня не получилось бы.

Ответы [ 4 ]

5 голосов
/ 01 июня 2011

Вы пытаетесь сломать идею абстракции: у вас должно быть все в порядке с DataItem. Он должен иметь все методы, которые вы на самом деле хотите вызвать. Это основная идея:

Have an interface to describe the communication and hide the implementation.

Попробуйте пересмотреть свой дизайн.

2 голосов
/ 01 июня 2011

Возможно, вы захотите использовать ключевое слово instanceof, например:

if (o instanceof DataItemRibbon)
  ((DataItemRibbon)o).doSomething();

EDIT
Я согласен с Владимиром Ивановым в том, что написанное мной работает, но это признак плохого дизайна. Вы должны переработать иерархию объектов, как предлагает Владимир.

1 голос
/ 01 июня 2011

Вы можете проверить, является ли ваш объект DataItem экземпляром некоторого дочернего класса DataItem.После этого вам просто нужно привести этот объект к этому классу, чтобы вы могли вызывать его методы.

0 голосов
/ 01 июня 2011

Вы можете вызвать метод на DataItem, который вы переопределяете для подклассов.Метод для фактического типа - тот, который вызывается.Это стандартная методика полиморфизма.

...