2016-04-11 18 views
-1

インターネット経由でルームオーディオシステムのリモートコントロールを有効にして、ホームメディアシステムをアップグレードするように割り当てられました。それはレガシーシステムなので、私はアーキテクチャの多くを変更することはできません。以下は、プログラムの簡略化された形式です。システムは、Home_Media_Systemオブジェクトで初期化されたいくつかのメインクラスで構成されています。C#の他の兄弟クラス内のクラスから兄弟クラスの関数を呼び出す方法

class Home_Media_System 
{ 

    Network _networkdata 

    Speakers _speakers 

    Lights _lights 

    Household_devices household_devices 

} 

class Speakers 
{ 
    void Play_Audio(); 
} 


class Network 
{ 
    UdpReceiver udpReceiver 
    UdpTransmitter udpTransmitter 

} 


class UdpReceiver 
{ 
    void receive_audio_player_command() 
    { 
     if(playCommand) 
      start_audio(); 
    } 

    void start_audio() 
    { 
     //How do I call the Play_Audio() function in class Speakers 
    } 

} 

class UdpTransmitter 
{ 
    void send_response(); 
} 

私の問題は、ネットワーククラス内UdpReceiverクラスでコマンドを受信した後、Play_Audio()関数を呼び出すことです。一文で説明するのはかなり難しいので、これで質問のタイトルがクリアーになることを願っています。

メインクラスはHome_Media_Systemで初期化されることに注意してください。今はダブルイベントハンドラの使用を考えていますが、もっとエレガントな方法があるのだろうかと思います。

+0

この質問には回答できません。それはあなたのソフトウェアの実装に依存します。 – Liam

+0

代表団のように聞こえます – Jodrell

+0

クラスはパブリックではないため、メインクラス以外のクラスにアクセスすることはできません。 – jdweng

答えて

0

これはあなたが持っている悪い階層の1つで、デザインに間違いがあります。しかし、これに答えるために、C#でイベント/代理人を使用して、親を介して兄弟間で通信することができます。あなたのNetworkクラスで

UdpReceiverクラスでも公開/内部およびパブリックとしても方法として、すべてのクラスを作る

public class Network 
{ 
    private UdpReceiver udpReceiver; 
    UdpTransmitter udpTransmitter 
    public event EventHandler PlayAudioEvent; 

    public void Network() 
    { 
     udpReceiver.PlayAudioEvent += PlayAudioEventHandler; 

    } 

    void PlayAudioEventHandler(object sender, EventArgs e) 
    { 
     if (PlayAudioEvent != null) 
     { 
      PlayAudioEvent(this, null); 
     } 
    } 
} 

public class UdpReceiver 
{ 
    public event EventHandler PlayAudioEvent; 
    void receive_audio_player_command() 
    { 
     if(playCommand) 
      start_audio(); 
    } 

    void start_audio() 
    { 
     //How do I call the Play_Audio() function in class Speakers 
     if (PlayAudioEvent != null) 
     { 
      PlayAudioEvent(this, null); 
     } 
    } 

} 

public class Home_Media_System 
{ 


     public void Home_Media_System() 
     { 
      _networkdata.PlayAudioEvent += PlayAudioEventHandler 
     } 

     void PlayAudioEventHandler(object sender, EventArgs e) 
     { 
      _speakers.PlayAudio(); 
     } 

を必要なときにイベントを発生させる:だから私は2つの場所でイベントを定義します。

+0

あなたはイベントを購読中止していません。それは悪くないですか? – NinjaFart

1

まず最初に、あなたのクラスは私のメソッドのように非公開です。voidの前にパブリックメソッドを追加する必要があります。メソッドはpublicにしてからクラスのインスタンスを作成する必要があります

Speakers speakers= new Speakers(); 
speakers.Play_Audio(); 
+0

答えてくれてありがとう、しかし、私はそれが私が望むパラメータなしでスピーカーの新しいインスタンスを作成するので、私はそれを行うことはできません。 Home_Media_Systemで初期化されたスピーカーオブジェクトにアクセスする必要があります。 – Mittens