如何在 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。
我被指派通过互联网远程控制房间音频系统来升级家庭媒体系统。由于它是遗留系统,我无法更改大部分架构。下面是该程序的简化形式。系统由几个主要的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。