如何调用Creator Method's

本文关键字:Method Creator 何调用 调用 | 更新日期: 2023-09-27 18:09:32

如果我们有一个class

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方法就像这个例子中的a类方法。这是非常必要的,当我使用一个表单来显示另一个表单:from FormA

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

我应该onFormClose事件的FormB再次显示FormA

编辑首先,我认为解析A的Ref作为对象,但存储引用作为一个字段,后来我发现这是不可能的!

首先我想也许使用反射我们可以识别和调用创建者方法,但我认为我不匹配一些OOP设计模式的

如何调用Creator Method's

唯一的方法是在调用构造函数时传入"creator":

 B b = new B(this);

当然,这意味着B需要有一个具有适当参数类型的构造函数,该构造函数应该匹配它需要与其创建者做的任何事情。

编辑:正如在评论中所指出的,它真的不需要在构造时完成-它可以是一个属性:

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

它们基本上是一样的。

我认为这是通常一个坏主意,说实话。它在两个类之间引入了合理的紧密耦合。对于B来说,最好发布一个创建者可以订阅的事件,以便在B上处理适当的状态更改等。

根据@Jon Skeet的回答,最好是类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);
        }
    }
}

您可以简单地使用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; } ); 
}