2016-03-14 59 views
0

我設計爲TextForms基類和派生類爲標籤,場,Dialogboxes ...等 我使用下面的代碼執行的方法

public class TextForm 
{ 
    public void Refresh() 
    { 
    } 
} 

public class Label : TextForms 
{ 
    public void Refresh() 
    { 
    } 
} 

和在我的程序我instanciating許多標籤..和某處我需要調用TextForms.Refresh()必須執行所有派生類實例Refresh()方法。

我無法想象該怎麼辦?

+7

那麼你需要有一些方法來引用所有這些標籤......你不能找到「所有曾經創建過的類型的實例」。 –

+0

基本上,您將需要所有標籤的引用,並在此引用數組中的每個元素的循環中調用該方法。 – HimBromBeere

+3

@JonSkeet也許他把所有的人都放在了一張表格上,並且有一個錯誤的/壞的方法?可能的解決方案是遍歷表單的所有標籤。 OP可以提供上下文,所以我們可以幫助他改進他的編碼和問題。 – Mafii

回答

2

默認情況下,您找不到所有實例。儘管如此,有一些設計模式可以讓您更輕鬆地完成此操作。有Composite Design Pattern這使您能夠將子組件添加到您的組件。例如,窗體/窗口組件將成爲例如標籤和文本字段等子組件的容器。然後,當你在容器上調用Refresh時(例如Form/Window),它可以調用其所有子組件上的Refresh

還有Observable Design Pattern讓組件註冊'事件'(不一定通過.Net的事件實現)。然後,當您在觀察者上調用Refresh方法時,它將調用所有已註冊的observable的Refresh方法。

1

在你的問題中,你寫TextForms所以我假設這是一個對象是某種枚舉。

Liskows替換原則規定,如果你有一個基類中的任何一種,你可以隨時通過這個列表,這樣的替代派生類的基類

var textForms = new List<TextForm>(); 
textForms.Add(new Label()); 
textForms.Add(new TextBox()); 

所以現在你可以簡單地重複:

foreach(var textForm in textForms){ 
    ((TextForm) textForm).Refresh(); 
} 

您可能需要稍微調整一下該示例才能使其工作,但這是您的問題的一般答案。

0

像m102說,如果不是不可能找到所有的實例是不切實際的。但是,假設您使用畫布或頁面來顯示標籤,則可以獲取該畫布中的所有標籤。

TextForm tf = new TextForm(); 
foreach (Control ctrl in yourCanvas.Children.OfType<Label>()) 
{ 
tf.Refresh(); 
} 

這將從畫布中檢索所有類型爲標籤的控件。這不會一次刷新它們。

注意:我不建議更改不可見/屏幕上的標籤。這將要求他們留在記憶中,這是不明智的。哦,你的刷新函數有一個大寫字母R(這通常是爲類保留的)。