2011-09-23 69 views
0

如果我们有一个类如何调用造物主方法的

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(); 
    } 
} 

那么,有没有一种方法来调用这个类实例的方法的造物主方法等。 这是很要紧的,当我使用形式展现另一种形式: 从FORMA

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

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

编辑 开始我以为解析一个由参考作为对象,但存储参考作为一个领域后,我创立了这是不可能的!

首先,我想也许使用反射,我们可以识别和呼叫造物主方法的,但我想我不匹配的一些OOP设计模式的

+1

稍微偏离主题,但可能是更好的模式来遵循:事件? –

回答

3

的唯一方法是在“创造者”通过调用构造函数时:

B b = new B(this); 

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

编辑:正如在评论中指出,它并不真正需要在建设做- 它可能是一个属性:

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

他们虽然达到基本相同的事情。

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

+1

怎么样的财产注入?我知道这也不好,但它是另一种选择。 – Oded

+0

@Oded:你的意思是设置'b.Creator = this;'事后?是的,这是一种可能性 - 非常相同,真的。将编辑。 –

+0

+1使用事件通知而不是紧密耦合两个类。 OP似乎处于开始了解事件的良好阶段。 – spender

1

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

} 
1

@Jon Skeet从的answer继,这将是优选的B类时有事和A类消耗该事件发出的事件。

通过这种方式,类B不依赖于类A.您可以重用类B以外的类而不修改类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); 
     } 
    } 
}