我正在为TextForms设计基类,并为标签,字段,对话框等设计派生类。 我使用以下代码
public class TextForm
{
public void Refresh()
{
}
}
public class Label : TextForms
{
public void Refresh()
{
}
}
并且在我的程序中我正在实现许多标签..在某处我需要调用TextForms.Refresh(),它必须执行所有派生类实例的Refresh()方法。
我无法想象怎么做?
答案 0 :(得分:2)
默认情况下,您无法找到所有实例。但是,有一些设计模式可以让您更容易地这样做。有Composite Design Pattern这使您能够将子组件添加到组件中。例如,窗体/窗口组件将是像Labels和TextFields这样的子组件的容器。然后,当您在容器上调用Refresh(例如,Form / Window)时,它可以在其所有子组件上调用Refresh
。
还有Observable Design Pattern让组件注册'事件'(不一定通过.Net的事件实现)。然后,当您在观察者上调用Refresh方法时,它将调用已注册的所有可观察对象的Refresh方法。
答案 1 :(得分:1)
在你的问题中,你写了 TextForms ,所以我假设这是一个可枚举的对象。
Liskows替换原则规定如果你有任何类型的基类,你总是可以用派生类替换基类
var textForms = new List<TextForm>();
textForms.Add(new Label());
textForms.Add(new TextBox());
所以现在你可以简单地遍历这个列表:
foreach(var textForm in textForms){
((TextForm) textForm).Refresh();
}
您可能需要稍微调整一下示例才能使其正常工作,但这是您问题的一般答案。
答案 2 :(得分:0)
与m102一样,如果不是不可能找到所有实例,那么它是不切实际的。但是,假设您使用画布或页面来显示标签,则可以获得该画布中的所有标签。
TextForm tf = new TextForm();
foreach (Control ctrl in yourCanvas.Children.OfType<Label>())
{
tf.Refresh();
}
这将从画布中检索type label的所有控件。这不会立即刷新所有内容。
注意:我不建议更改不可见/屏幕上的标签。它需要将它们保存在内存中,这在性能方面是不可取的。哦,你的刷新函数有一个大写R(这通常是为类保留的。)