如何从父引用调用子方法?

时间:2011-06-01 08:24:23

标签: java inheritance polymorphism subclass

我有一个名为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 个答案:

答案 0 :(得分:5)

你试图打破抽象概念:你应该对DataItem没问题。它应该具有您实际想要调用的所有方法。这是主要的想法:

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

尝试重新考虑您的设计。

答案 1 :(得分:2)

您可能希望使用instanceof关键字,如下所示:

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

修改
我同意弗拉基米尔·伊万诺夫的观点,即我所写的作品,但却表明设计糟糕。您应该像Vladimir建议的那样重新设计对象层次结构。

答案 2 :(得分:1)

您可以检查DataItem对象是否是某个DataItem子类的实例。之后,您只需将此对象强制转换为该类,这样您就可以调用其方法。

答案 3 :(得分:0)

您可以在DataItem上调用覆盖子类的方法。实际类型的方法是被调用的方法。这是一种标准的多态技术。