2016-12-14 13 views
0

私は2つのクラスを持ちます.1つのクラスはメインクラスに似ていて、私はメインクラスからインスタンス化されたセカンダリクラスを持っています。セカンダリクラスのメインクラスのメソッドをどのように使用できるのでしょうか。ここに私が望むもののイラストを与えるためのコードがあります。C#別のクラスからクラスのメソッドにアクセスするには?

public class MainClass 
{ 
    private SecondaryClass secondaryClass; 
    private int testValue; 

    public MainClass() 
    { 
     this.secondaryClass = new SecondaryClass(); 
     testValue = 0; 
    } 

    public void updateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public Class SecondaryClass : Form 
{ 
    public SecondaryClass() 
    { 

    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     // I want to be able to do this: 
     primaryClass.updateTestValue(100); 
    } 

}

答えて

3

あなたはクラスが別の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つの追加の型であり、利点は、デリゲートの構文での作業を避けることができるということです。代理人には引数に名前がないという欠点があります。そのため、混乱させると簡単にバグを起こすことができます。

+0

クラスに複数のアクションをどのように渡すことができますか? –

+0

複数のパラメータを持つSecondaryClassを構築し、それをPrimaryClassから渡すことでそれらを渡します。 – JARRRRG

+0

私はインターフェイスに基づいて2番目のソリューションを追加しました。このインタフェースは、複数のメソッドを公開することができます。その後、セカンダリクラスは1つのパラメータしか持ちません。必要なときにいつでも必要なメソッドを呼び出すだけで十分です。 –

0
public class MainClass: Form 
{ 
    private int testValue; 

    public MainClass() 
    { 
     testValue = 0; 
    } 

    public void updateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : MainClass 
{ 
    public SecondaryClass() 
    { 

    } 

    private void button1_click(Object sender, EventArgs e) 
    { 
     // I want to be able to do this: 
     updateTestValue(100); 
    } 
} 
0

クラスでは唯一、あなたが何ができるか一つのベースクラス

を持つことができます移動しているプラ​​イマリクラスにフォームベースクラスアップをしてから二からクラスはPrimaryクラスとして基本クラスを持ち、次のように関数を使用します。

public class PrimaryClass : Form 
{ 
    private int testValue; 

    public void PrimaryClassMethod() 
    { 
     Console.WriteLine("Method from Primary Class"); 
    } 

    public void UpdateTestValue (int val) 
    { 
     testValue = val; 
    } 
} 

public class SecondaryClass : PrimaryClass 
{ 
    public void CallPrimaryClassMethod() 
    { 
     this.PrimaryClassMethod(); 
     this.UpdateTestValue(10000); 
    } 

} 

https://dotnetfiddle.net/PC2WVu

関連する問題