0

通常我们通过使用事件或委托ClassB来更新一些数据(所以超过 2 个类)。ClassA

我需要做的是ClassAClassCClassC通过ClassA和打开ClassB)更新。所以不能直接访问ClassCto ClassA

这怎么可能,这样我就不需要做任何额外的代码ClassB

例子:

class ClassA
{
    private void OpenClassB() 
    {
        ClassB b = new ClassB();
        b.WorkOnB();
    }

    public void UpdatingFromClassC()
    {
        // I have to call this method from ClassC (from method WorkOnC)
    }
}

class ClassB
{
    public void WorkOnB()
    {
        //...
        //and:
        OpenClassC();
    }

    private void OpenClassC()
    {
        ClassC c  = new ClassC();
        c.WorkOnC();
    }
}

class ClassC
{
    public void WorkOnC()
    {
        //call UpdatingFromClassC() method on form1 from here!
    }
}

我不喜欢传递 Form1 的引用。我必须使用事件或委托——最好的选择。

---

让我更清楚。我做窗体。这是一个带有 2 个类的示例:

 public partial class Form1 : Form
 {
    Class1 c1;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (c1 == null)
        {
            c1 = new Class1();
            c1.OnDoWork += new Action(From_Class1_OnDoWork);
            c1.DoSomeWork();
        }
    }

    private void From_Class1_OnDoWork()
    {
        //put your code into here for refreshing
        MessageBox.Show("Form1 is being refreshed!");
    }
}

class Class1
{
    public event Action OnDoWork;
    public Class1()
    {
        //constructor 
    }

    public void DoSomeWork()
    {
        System.Windows.Forms.MessageBox.Show("Do some work in Class 1");
        if (OnDoWork != null)
        {
            OnDoWork();
        }
    }
}

现在我想创建另一个表单 (Form2),它将从 Class1 打开。我必须从 Form2 唤醒 Form1 上的方法(或将数据传递给它)。

我希望你明白了。

4

2 回答 2

0

如果不向 引入代码,这是不可能的,因为根据您的设计,和ClassB的实例之间没有直接通信。既然是中介,它就必须传达一些他们可以交流的机制。ClassAClassCClassB

最简单的解决方案就是将对相关ClassA实例的引用传递给ClassCvia ClassB。如果这在您看来太像不必要的耦合,那么是的,您应该使用指定要采取的操作的委托(并附上对 的引用ClassA)。

于 2013-03-02T18:46:45.550 回答
0

感觉 C 和 B 的构造函数都应该接收Action委托参数,在这种情况下是UpdatingFromClassC()的委托。确切的机制不一定是这样,但从给出的描述来看,似乎很可能适合这种情况。

于 2013-03-02T18:52:41.130 回答