我有一个名为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
,因此将其抽象化对我来说无效。
答案 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
上调用覆盖子类的方法。实际类型的方法是被调用的方法。这是一种标准的多态技术。