2016-03-14 38 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(这通常是为类保留的)。