2011-06-01 111 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子類。之後,您只需將該對象投射到該類,以便您可以調用其方法。