代码之家  ›  专栏  ›  技术社区  ›  yoav.str

C-孩子和父母如何相处?

  •  1
  • yoav.str  · 技术社区  · 14 年前

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

    例如,假设我有一个表单按钮和一个richtextbox,我想用evey单击来更改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;
            }
    
    
    
        }
    
    
    }
    

    公共类mybutton:button { 静态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;
            }
        }
    

    以父亲的形式…

    我觉得我的所有概念都是废话,有人能帮我引路吗? 但我错了,这是循环的,有人能帮我吗?…

    4 回复  |  直到 14 年前
        1
  •  2
  •   Zachary Yates    14 年前

    因此,也许您要寻找的更多是接口实现:

    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
  •  2
  •   JonWillis    14 年前

    首先,你谈论的是窗体上的子元素,而不是窗体的实际子类。对吗?

    因此,您希望删除窗体和按钮之间的依赖关系。这可以通过设计模式来解决。您可以让button实现一个如ibutton的接口。然后在表单中使用工厂类创建按钮,并返回IButton引用而不是MyButton。或者,使用依赖注入而不是工厂。

    不管怎样,我看不出你所做的有什么好处,你能更详细地解释一下这个问题吗?

        3
  •  0
  •   Chris Taylor    14 年前

    在您的示例中,按钮知道 Form 已调用委托 myFartherDelegate . 为什么不直接处理按钮。单击父窗体上的事件?

    你的代码应该是这样的

      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 按钮的事件。如果您需要一个比这更松的耦合,那么它可能有助于更详细地解释需求。

        4
  •  0
  •   KeithS    14 年前

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

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

    尝试一个包含ichild引用(按钮)和公共事件处理程序的父级(表单)。然后,创建一个实现ichild并具有可以引发的事件的子级。然后,您需要第三个类来创建(或给定)父级和子级,将子级赋予父级(作为ichild),并将子级的事件挂接到父级的事件处理程序。现在你的父母只知道它有一个孩子的样子,而你的孩子有一面旗子,当一些重要的事情发生时,他可以挥挥手,但不必知道谁在听。