Silverlight / C# には、Child _child = new Child(...) のインスタンスを作成するクラス Main があります。
ここで、Child クラスで、Main クラスからメソッドを呼び出す必要があります。これを行う最善の方法は何ですか?イベント?
Silverlight / C# には、Child _child = new Child(...) のインスタンスを作成するクラス Main があります。
ここで、Child クラスで、Main クラスからメソッドを呼び出す必要があります。これを行う最善の方法は何ですか?イベント?
最も簡単な解決策は、クラスMain
のインスタンスへの参照を提供することです。Child
public class Child
{
private Main main;
public Child(Main main)
{
this.main = main;
main.Bar();
}
}
public class Main
{
public void Foo()
{
Child c = new Child(this);
}
public void Bar()
{
}
}
これは、結合を最小限に抑えるためにインターフェイスのMain
背後にあるクラスを抽象化することでさらに改善できます。IMain
しかし、最善の解決策は、イベントバブリングを利用することです
答えは、呼び出しのセマンティクスが何であるかによって異なります。あなたの例は曖昧であり、推論する明確なセマンティクスがないため、良い答えを出すことは不可能です。
Mainは子供にサービスを提供していますか?たとえば、ChildがMainで実行したい呼び出しは、「何とかすることを許可されているユーザーのリストを取得してください」または「11月に売掛金をすべて合計する」のようなものですか。
それとも、メインはチャイルドに関連するイベントに反応していますか?たとえば、Childはボタンで、Mainはフォームであり、Mainはボタンがクリックされたときに反応したいと考えています。
前者の場合、Mainは、目的のサービスを実装するオブジェクト(場合によってはそれ自体)をChildに提供する必要があります。オブジェクトは、Main自体、メソッドへのデリゲート、またはインターフェイスである可能性がありますが、サービスが必要なときにChildが呼び出すことができるものです。
後者の場合、メインはチャイルドによって発生したイベントをリッスンする必要があります。
どちらが正しいかは、オブジェクトの意味によって異なります。意味をもっと明確に説明できますか?
イベンティングは適切なパターンです。オブジェクト/クラス階層における情報の流れに関する概念的な理由については、この回答を参照してください。
より深いコンポーネントは、通常はイベントを介して情報を「解放」するだけで、直接呼び出すことなくチェーンを「フロート」します。