WinForms:将父控件的引用传递给多个子控件是一种好的做法吗

k2arahey  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我有以下模式。有一个带有按钮的父窗体和一个用于创建子窗体的抽象基类。多个子窗体,如ChildForm1ChildForm2将从ParentForm中产生,如按按钮等事件。这是我目前正在做的事情的简单表示。

public partial class ParentForm : Form
{
    public ParentForm()
    {
        InitializeComponent();
    }

    private void Button1_OnClick(object sender, EventArgs e)
    {
        new ChildForm1(this).Show();
    }

    // Some other methods
}

public abstract partial class BaseChildForm : Form
{
    protected readonly Form _parent;

    public BaseChildForm(Form parent)
    {
        _parent = parent;
        InitializeComponent();
    }

    private void ThisForm_OnAppear(object sender, EventArgs e)
    {
        // Do some changes in the parent form through _parent field
    }

    // Some other methods as well
}

public partial class ChildForm1 : BaseChildForm
{
    public ChildForm1(Form parent) : base(parent){}

    // Overridden abstract methods and other methods
    // Do some tampering with the parent form
}

public partial class ChildForm2 : BaseChildForm
{
    public ChildForm2(Form parent) : base(parent){}

    // Overridden abstract methods and other methods
    // Do some tampering with the parent form
}

在这段代码中,我实际上希望在子窗体中执行某些操作时访问和控制ParentForm的行为和其他属性。但是正如您所看到的,ParentForm的公共成员完全暴露给子窗体。此外,当多个ChildForm示例在给定时间操作ParentForm时,它可能是一个问题并导致意外结果。
到目前为止,这个模式对我来说是“gets things done”。但我想知道是否有其他更好的方法来达到我的要求?

xkftehaa

xkftehaa1#

我不认为将ParentForm暴露给子窗体是一个好的做法。您可以为常见的ParentForm操作/属性提取接口,在ParentForm中实现它们,并将接口示例注入到子窗体,如下所示:

interface IParent
{
    int Property1 { get; set; }
    void Method1();
}

class ParentForm : Form, IParent
{
    public int Property1 { get; set; }

    public void Method1()
    {
        // Implementation here.
    }
}

class ChildForm1 : Form
{
    private readonly IParent parent;

    public ChildForm1(IParent parent)
    {
        this.parent = parent;
    }

    // Use parent accordingly
}

相关问题