0

通常、イベントまたはデリゲートを使用して、一部のデータをClassBから(つまり2クラス以上)に更新します。ClassA

私がする必要があるのは、から更新することですClassAClassCとを介してClassC開かれます)。したがって、からへの直接アクセスはありません。ClassAClassBClassCClassA

で追加のコードを実行する必要がないように、これはどのように可能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から開く別のフォーム(Form2)を作成します。Form1のメソッドをForm2からウェイクアップする(またはデータを渡す)必要があります。

私はあなたがポイントを得たことを望みます。

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 に答える