如何调用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":
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; } );
}