如何在 C# 中从另一个兄弟 class 中的 class 调用兄弟 class 的函数

How to call the function of a sibling class, from a class within the other sibling class in C#

我被指派通过互联网远程控制房间音频系统来升级家庭媒体系统。由于它是遗留系统,我无法更改大部分架构。下面是该程序的简化形式。系统由几个主要的classes组成,初始化在Home_Media_Systemobject.

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();
}

我的问题是在网络 class 内的 UdpReceiver class 中收到命令后调用 Play_Audio() 函数。我希望这能澄清问题标题,因为很难用一句话来解释。

请注意,主要 classes 在 Home_Media_System 中初始化。现在我正在考虑使用双事件处理程序,但我想知道是否有更优雅的方法。

首先,您的 classes 和您的方法一样是私有的,要调用播放音频方法,您应该在 void 之前添加 public,相同的角色适用于所有方法,当您创建方法时public 然后你必须创建你的实例 class

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

你的层次结构不好,设计肯定有问题。但为了回答这个问题,我们可以在 C# 中使用 events/delegates 通过父级在兄弟姐妹之间进行通信。所以我会在两个地方定义一个事件:

在您的 Network class 和 UdpReceiver class 中并在需要时引发事件

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();
        }

也将所有 classes 设为 public/internal 并将方法设为 public。