2012-08-23 28 views
1

我有一些基類派生類。 基類是FormItem,派生類例如是InputField,Label或Button。從數組列表中的一個對象中調用適當的方法

在FormItem類我有許多虛擬功能如:

internal virtual void draw(parameters) {} 

該功能在每個派生類超載。

我將派生類中創建的對象存儲在名爲formItems的數組列表中。

當我撥打電話這樣的:

((FormItem)formItems[index]).draw(parameters) 

我希望被稱爲重載函數,因爲在基類的功能是虛擬的。然而,調用基類的draw()方法。

一個比較難看的解決方案是使一個巨大的if語句像這樣:

if (formItems[index] is Button) 
    { 
    ((Button)formItems[index]).draw(parameters); 
    } 
else if (formItems[index] is Label) 

等等

但是我希望有一個更好的解決方案,沒有按」 t需要我創建這個巨大的if-else塊,但允許我讓編譯器自動將我正在查看的項目解釋爲派生類的對象,並調用相應的draw()方法。有誰能夠幫助我?

+1

如何覆蓋派生類中的虛擬方法?你可以告訴我們你的代碼,請 – horgh

+1

這是OOP的概念,多態性,你不必檢查類型並調用適當的方法。你的蹤跡很好,但顯然你的執行有一個錯誤。郵政編碼示例如何重寫虛擬方法繪製。 –

回答

3
internal virtual void draw(parameters) {} 

該功能在每個派生類超載。

我懷疑是字面上是真的。爲了確保您能自動調用正確實施,它必須是覆蓋在每個派生類,即

class Button : FormItem { 
    internal override void draw(parameters) { /* actual impl */ } 
    ... 
} 

只要你override,它應該工作的罰款。

+0

謝謝,這工作。 –

相關問題