あなたはクラスが別の1つの派生を持つことなく通信することができます。
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
メソッドを定義するインタフェースを実装できます。次に、そのメソッドにアクセスする必要があるすべてのオブジェクトに参照を渡します。セカンダリクラスのオブジェクトのような他のオブジェクトは、単純にそのインタフェースのメソッドを呼び出すだけで、実際に参照しているプライマリクラスであることはもう分かりません。
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
)内の1つの追加の型であり、利点は、デリゲートの構文での作業を避けることができるということです。代理人には引数に名前がないという欠点があります。そのため、混乱させると簡単にバグを起こすことができます。
クラスに複数のアクションをどのように渡すことができますか? –
複数のパラメータを持つSecondaryClassを構築し、それをPrimaryClassから渡すことでそれらを渡します。 – JARRRRG
私はインターフェイスに基づいて2番目のソリューションを追加しました。このインタフェースは、複数のメソッドを公開することができます。その後、セカンダリクラスは1つのパラメータしか持ちません。必要なときにいつでも必要なメソッドを呼び出すだけで十分です。 –