通常我们会将一些数据从ClassB
更新为ClassA
(因此超过2个类别) - 通过使用事件或代理。
我需要做的是从ClassA
更新ClassC
(ClassC
通过ClassA
和ClassB
打开。因此,无法从ClassC
直接访问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的参考。我必须使用活动或代表 - 最好的选择。
让我更清楚一点。我做windows窗体。以下是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();
}
}
}
现在我想创建一个从Class1打开的nother Form(Form2)。我必须从Form2唤醒Form1上的方法(或将数据传递给它)。
我希望你明白这一点。
答案 0 :(得分:0)
如果不向ClassB
引入代码,则无法做到这一点,因为根据您的设计,ClassA
和ClassC
的实例之间没有直接的通信。由于ClassB
是中介,它必须传达一些可以与之沟通的机制。
最简单的解决方案就是通过ClassA
将相关ClassC
实例的引用传递给ClassB
。如果你觉得这太像是不必要的耦合,那么是的,你应该使用一个指定要采取的动作的委托(并包含对ClassA
的引用)。
答案 1 :(得分:0)
感觉谎言C和B的构造函数应该接收 Action 委托参数,在这种情况下是 UpdatingFromClassC()的委托。确切的机制不一定是这个,但根据给出的描述似乎最适合这种情况。