从类的所有实例执行方法

时间:2016-03-14 07:33:22

标签: c# inheritance

我正在为TextForms设计基类,并为标签,字段,对话框等设计派生类。 我使用以下代码

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

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

并且在我的程序中我正在实现许多标签..在某处我需要调用TextForms.Refresh(),它必须执行所有派生类实例的Refresh()方法。

我无法想象怎么做?

3 个答案:

答案 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(这通常是为类保留的。)