【问题标题】:c# - how does child and parent comuncatec# - 孩子和父母如何交流
【发布时间】:2010-09-03 19:30:07
【问题描述】:

假设我有一个表格和他的孩子 我希望孩子在他们不认识的情况下触发他的父亲 换句话说,我希望孩子是通用的

例如,假设我有一个表单按钮和一个richTextBox,我想通过点击来更改richTextBox 文本

我希望表单和按钮彼此不认识,我该怎么做? 我试试这个:

public partial class Form1 : Form
{

    delegate void myfatherDelgate();
    static int msgCounter = 0 ;

    public Form1()
    {
        InitializeComponent();
        button1 = new myButton();
        myfatherDelgate += myMethod();

    }
    public void myMethod()
    {
        switch (msgCounter)
        {
            case 1:
                {
                    richTextBox1.Text = "first click";
                    msgCounter++;
                }
            case 2:
                {
                    richTextBox1.Text = "second click";
                }
            defult: this.Close;
        }



    }


}

public class mybutton : 按钮 { 静态int myint;

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        this.Parent.Invoke(myfatherDelgate());
    }


}

最简单的方法是:

    private void button1_Click(object sender, EventArgs e)
    {
        switch (msgCounter)
        {
            case 1:
                {
                    richTextBox1.Text = "first click";
                    msgCounter++;
                }
            case 2:
                {
                    richTextBox1.Text = "second click";
                }
            defult: this.Close;
        }
    }

以父亲的形式...

我认为我的所有概念都是废话,有人可以照亮我吗? 但是我在这里弄错了,有人可以在这里帮助我吗?...

【问题讨论】:

  • 可怜的孩子永远不会认识他的父亲?你是什​​么怪物..
  • 我知道如何在父亲认识他的儿子并推翻他的情况下做到这一点>
  • 偶尔打个电话也不会痛。你知道,保持联系......

标签: c# winforms


【解决方案1】:

所以也许您正在寻找的更多的是接口实现:

public interface IMyInterface {
    void MyAction();
}

public partial class form1 : Form, IMyInterface {
    public void MyAction() {
        richTextBox1.Text = "first click";
        ...
    }
}

public class button1 : Button {
    protected override void OnClick(EventArgs e) {
        var parent = this.Parent as IMyInterface;
        if( parent != null ) {
            parent.MyAction();
        }
    }
}

【讨论】:

    【解决方案2】:

    首先,您谈论的是表单上的子元素,而不是表单的实际子类。对吧?

    所以你想删除表单和按钮之间的依赖关系。这可以通过设计模式来解决。你可以让按钮实现一个说IButton的接口。然后在表单中使用 Factory 类来创建按钮并返回 IButton 引用而不是 MyButton。或者,使用依赖注入而不是工厂。

    无论哪种方式,我都看不出你所做的事情有什么好处,你能更详细地解释一下这个问题吗?

    【讨论】:

    • 你能用简单的例子来展示一下吗?这个设计模式名称是什么?我可以使用反射来决定运行时的类名(这是主要的pherpes ...)吗?
    • 现在正在努力,没关系耶茨的答案似乎有你想要的。
    【解决方案3】:

    在您的示例中,按钮知道父 Form 有一个名为 myFartherDelegate 的委托。为什么不直接处理父 Form 上的 Button.Click 事件呢?

    你的代码看起来像这样

      public partial class Form1 : Form
      {
        static int msgCounter = 1;
        public Form1()
        {
          InitializeComponent();
          button1.Click += new EventHandler(button1_Click);
        }
    
        void button1_Click(object sender, EventArgs e)
        {
          switch (msgCounter)
          {
            case 1:
              {
                richTextBox1.Text = "first click";
                msgCounter++;
              }
              break;
            case 2:
              {
                richTextBox1.Text = "second click";
              }
              break;
            default: this.Close(); break;
          }
        }    
      }
    

    按钮根本不知道父窗体,只是一个普通按钮。当然,父级注册它对按钮的Click 事件感兴趣。如果您需要比这更松散的耦合,那么更详细地解释需求可能会有所帮助。

    【讨论】:

    • 这似乎是一个很好的解决方案,但假设我有 100 个按钮是实现它的最佳方式吗?
    • @yoav.str,点击时所有按钮都会做同样的事情吗?因为我相信@Zachary Yates 提出的解决方案会发生这种情况。父窗体上实现 IMyInterface 的所有按钮都将调用 MyAction,所以窗体上的 100 个按钮都在做同样的事情还是我错过了什么?大概你希望每个按钮都有一个独特的动作,所以你会为每个按钮连接一个适当的事件处理程序,当然你总是可以将相同的处理程序连接到每个按钮,然后检查'sender'参数来决定一个特定的动作。
    【解决方案4】:

    如果你想让孩子对他的父亲做点什么,父亲至少要知道孩子的存在。他不必知道细节,但如果他应该对他的孩子做出反应,那么他需要一个孩子将调用的事件处理程序、回调等。

    这可以通过称为依赖倒置原则的基本原则来实现。依赖于外部类的类不应该依赖于具体的实现,而应该依赖于实现的抽象。父母不应该需要一个特定的孩子,只需要看起来像一个并且行为像一个的东西。同样的道理,孩子不应该知道他们具体的父母,但如果需要交互,孩子必须有某种方式告诉父母事情,即使它不知道父母在听。

    尝试包含 IChild 引用(按钮)和公共事件处理程序的 Parent(您的表单)。然后,创建一个实现 IChild 并具有可以引发的事件的 Child。然后,您需要第三个类来创建(或被赋予)Parent 和 Child,为 Parent 提供 Child(作为 IChild),并将 Child 的事件挂钩到 Parent 的事件处理程序。现在,您的父母只知道自己有类似孩子的东西,而您的孩子有一面旗帜,他可以在发生重要事情时挥动旗帜,但不必知道谁在听。

    【讨论】:

    • o 想了解更多有关此模式的信息,我可以查看示例吗?
    • 这可能最好用工厂模式来表示。第三个类,称为 ParentFactory,将被要求提供一个“水合”的 Parent,并且 Factory 会知道 Parent 需要一个 Child 才能发挥作用。它会实例化两者,将它们连接起来,然后分发出去。有关使用接口抽象依赖关系的基本阅读,请查看松散耦合、Liskov Substitution Principle 和 Dependency Inversion Principle。
    猜你喜欢
    • 2017-07-20
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2020-02-08
    • 1970-01-01
    • 2011-08-29
    • 2021-02-23
    相关资源
    最近更新 更多