Как вызвать метод Создателя - PullRequest
1 голос
/ 23 сентября 2011

Если у нас есть класс

public class A
{
    public void resetValues()
    {
        //DoSomething
    }

    B b = new B();
}
public class B
{
    public B()
    {

    }

    void doSomething()
    {
        //Is there a way here to call A(the Creator) method resetValues();
        //Like Creator.resetValues();
    }
}

Итак, есть ли способ вызвать методы Creator, как в этом примере метода класса А.Это очень необходимо, когда я использую форму, чтобы показать другую форму: от FormA

FormB frmB = new FormB();
frmB.Show();
this.hide();

, чем я должен onFormClose Событие FormB, чтобы снова показать FormA

EDIT Сначала я подумал, что разбираю A как Ref как объект, но, сохранив ссылку как поле, позже я обнаружил, что это невозможно!

Сначала я подумал, что, возможно, используя отражение, мы можем определить и вызвать метод Creator, но я думаю, что янесоответствие некоторых из шаблонов проектирования ООП

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Единственный способ - передать «создатель» при вызове конструктора:

 B b = new B(this);

Конечно, это означает, что B должен иметь конструктор с соответствующим типом параметра, который долженсопоставьте все, что нужно с создателем.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, на самом деле это не нужно делать при построении - это может быть свойство:

 B b = new B();
 b.Creator = this;

Хотя это в основном одно и то же.

Я бы сказал, что это обычно плохая идея, если честно.Он вводит достаточно тесную связь между двумя классами.B может быть лучше опубликовать событие, на которое может подписаться создатель, для обработки соответствующих изменений состояния и т. Д. На B.

1 голос
/ 23 сентября 2011

Исходя из @ Jon Skeet ' answer , было бы предпочтительным, чтобы класс B генерировал событие, когда что-то происходит, и класс A использовал его.

Таким образом, класс B не зависит от класса A. Вы можете повторно использовать класс B с классами, отличными от класса A, без изменения внутренних элементов класса B. Из вспомогательного POV это гораздо предпочтительнее.

Вы можете настроить его следующим образом:

public class A
{
    B b = new B();

    public A()
    {
       b.SomethingHappened += SomethingHappenedHandler; 
    }
    public void resetValues()
    {
        //DoSomething
    }
    public void SomethingHappenedHandler(object sender, EventArgs args)
    {
        resetValues();
    }

}

и

public class B
{
    public event EventHandler SomethingHappened;
    public B()
    {

    }

    void doSomething()
    {
        var ev = SomethingHappened;
        if(ev != null)
        {
            ev(this, EventArgs.Empty);
        }
    }
}
1 голос
/ 23 сентября 2011

Вы можете просто использовать Action вместо Func<bool>, возвращая bool, позволяет передать обратно состояние, указывающее, была ли операция выполнена успешно.

class B
{ 
  private Func<bool> executeExternal;

  public B(Func<bool> executeExternal) 
  {
       this.executeExternal= executeExternal;

       // here is resetValues() will be executed in case of B class
       bool isDoneSuccessfully = this.executeExternal();
  } 
}

public class A 
{     
  public void resetValues()     
  {         
     //DoSomething     
  }      

  // basically we injecting a delegate
  B b = new B(() => { this.resetValues(); return true; } ); 

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