你可以讓班上學生交流,而無需一個從另一個派生。
public class MainClass
{
private SecondaryClass secondaryClass;
private int testValue;
public MainClass()
{
this.secondaryClass = new SecondaryClass(this.UpdateTestValue);
testValue = 0;
}
public void UpdateTestValue (int val)
{
testValue = val;
}
}
public class SecondaryClass : Form
{
private Action<int> UpdateValue { get; }
public SecondaryClass(Action<int> updateValue)
{
this.UpdateValue = updateValue;
}
private void button1_click(Object sender, EventArgs e)
{
this.UpdateTestValue(100);
}
}
在這個組織中,主類在創建次級類時將委託傳遞給它自己的實例級方法。次要類調用在適當的時候進行委託,而不知道它是什麼功能。
這是回調模式的例子。
還有其他同一想法的變體。例如,主類可以實現一個定義UpdateValue
方法的接口。然後,它將this
引用傳遞給需要訪問該方法的每個對象。其他對象,如次級對象,只需調用該接口的方法,再次不知道它實際上是它們引用的主類。
public interface IListener
{
void Update(int value);
}
public class MainClass : IListener
{
private SecondaryClass secondaryClass;
private int testValue;
public MainClass()
{
this.secondaryClass = new SecondaryClass(this);
testValue = 0;
}
public void Update(int val)
{
testValue = val;
}
}
public class SecondaryClass : Form
{
private IListener Listener { get; }
public SecondaryClass(IListener listener)
{
this.Listener = listener;
}
private void button1_click(Object sender, EventArgs e)
{
this.Listener.Update(100);
}
}
這個解決方案的價格是在系統(界面IListener
)一個額外的類型,而好處是,你可以避免與委託語法工作。代表有一個缺點,即它們的參數沒有名字,因此如果混合使用,您可以輕鬆地創建一個錯誤。
我怎麼能夠將多個動作傳遞給類? –
您可以通過構造具有多個參數的SecondaryClass並將它們從PrimaryClass中傳遞給它們來傳遞它們 – JARRRRG
我已經基於接口添加了第二個解決方案。這個接口可以暴露多個方法,然後輔助類只有一個參數。這足以讓它在需要時調用任何需要的方法。 –