c # - как соотносятся дочерний и родительский - PullRequest
1 голос
/ 03 сентября 2010

скажем, у меня есть форма и его ребенок и я хочу, чтобы ребенок вызвал своего отца, чтобы они не знали друг друга другими словами, я хочу, чтобы ребенок был родовым

например, скажем, у меня есть кнопка формы и 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;
        }



    }


}

публичный класс mybutton: кнопка { static 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 ]

2 голосов
/ 03 сентября 2010

Во-первых, вы говорите о дочерних элементах формы, а не о реальных подклассах формы.Правильно?

Итак, вы хотите удалить зависимость между формой и кнопкой.Это можно решить с помощью шаблонов проектирования.Вы могли бы иметь кнопку, реализующую интерфейс, скажем, IButton.Затем в форме используйте класс Factory для создания кнопки и возврата ссылки IButton вместо MyButton.Или используйте инъекцию зависимостей вместо фабрики.

В любом случае, я не вижу преимущества в том, что вы делаете, вы можете объяснить проблему более подробно?

2 голосов
/ 03 сентября 2010

Так что, возможно, вам нужна реализация интерфейса:

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();
        }
    }
}
0 голосов
/ 04 сентября 2010

Если вы хотите, чтобы ребенок что-то сделал с отцом, отец должен хотя бы знать, что ребенок существует.Ему не нужно знать специфику, но если он должен реагировать на своего ребенка, ему нужны обработчик событий, обратный вызов и т. Д., Которые ребенок будет вызывать.

Это может быть достигнуто с помощью основного принципа, называемогоПринцип обращения зависимостей.Классы, которые зависят от внешних классов, должны зависеть не от конкретных реализаций, а от абстракций реализации.Родителю не нужен конкретный ребенок, просто нечто, похожее на одно и действующее как единое целое.Дети, к тому же, не должны знать своего конкретного Родителя, но если требуется взаимодействие, Ребенок должен иметь какой-то способ рассказать Родителю, даже если он не знает, как Родитель слушает.

Попробуйте Parent (вашу форму), которая содержит ссылку IChild (кнопка) и открытый обработчик события.Затем создайте Child, который реализует IChild и имеет событие, которое он может вызвать.Затем вам нужен третий класс, который создает (или получает) Parent и Child, передает Parent Child (как IChild) и подключает событие Child к обработчику событий Parent.Теперь у вас есть родитель, который знает, что у него есть нечто похожее на ребенка, и у вас есть ребенок, у которого есть флаг, который он может подавать, когда происходит что-то важное, но ему не нужно знать, кто его слушает.

0 голосов
/ 03 сентября 2010

В вашем примере кнопка знает, что у родителя Form есть делегат с именем myFartherDelegate. Почему бы просто не обработать событие 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 кнопки. Если вам нужна более слабая связь, чем эта, то это может помочь объяснить требование более подробно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...