我有以下模式.有一个带有按钮的父窗体和一个用于创建子窗体的抽象基类.像ChildForm1,ChildForm2这样的多个子窗体将从按下按钮等事件的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名公众成员完全接触到了 children 表格.此外,当多个ChildForm实例在给定时间操作ParentForm时,这可能是一个问题并导致意外结果.

到目前为止,这个模式对我来说是"gets things done".但我想知道有没有其他更好的方法来满足我的要求?

推荐答案

我不认为将ParentFormexpose 给子窗体那么多是一种好的做法.您可以为常见的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
}

Csharp相关问答推荐

如何打印已添加到List的Linq值,而不是C#中的:System.Collections.Generic.List ' 1[System.Int32]?

如何从顶部提取发票号作为单词发票后的第一个匹配

AutoMapper -如何为两个不同的用例设置单个映射?

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

异步任务导致内存泄漏

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

try 创建一个C#程序,该程序使用自动实现的属性、覆盖ToString()并使用子类

映射器-如何映射到多个实体

使用DI实例化带有动态参数的服务?

为什么连接到Google OAuth2后,结果.Credential为空?

为什么我的UserControl没有加载到我的主窗口中?

当我在Git中暂存文件更改时,它们会消失