2011-06-01 103 views
1

我有一个名为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,所以使它抽象不适合我。

回答

5

你想打破抽象的想法:你应该没问题的DataItem。它应该有你想要调用的所有方法。这是主要想法:

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

尝试重新考虑您的设计。

2

您可能需要使用instanceof关键字,像这样:

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

编辑
我弗拉基米尔·伊万诺夫认为,我已经写的作品,但糟糕的设计的指示。你应该像Vladimir所建议的那样重新修改你的对象层次结构。

0

您可以调用DataItem的方法,您可以为子类重写该方法。实际类型的方法是被调用的方法。这是一种标准的多态技术。

1

你可以检查你的DataItem对象是否是instanceof某个DataItem子类。之后,您只需将该对象投射到该类,以便您可以调用其方法。