У меня есть интерфейс под названием IDataIO:
public interface IDataIO
{
event DataReceivedEvent DataReceived;
//.....more events,methods and properties
}
У меня также есть несколько классов, которые реализуют этот интерфейс, а именно UdpIO
, TcpIO
, SerialIO
.
Теперь у меня есть класс IO
, который позволяет мне переключаться между различными устройствами ввода/вывода. Каждый экземпляр этого класса имеет свойство CurrentIODevice
, которое может быть одним из SerialIO
, UdpIO
или TcpIO
. Когда это свойство назначено, я присоединяю 1 или более обработчиков к DataReceivedEvent
, чтобы мой GUI был уведомлен о приеме входящих данных, а также о других классах, которые необходимо уведомить.
public class IO
{
IDataIO CurrentIODevice;
public IO()
{
SerialIO serial = new SerialIO();
TcpIO tcp = new TcpIO();
UdpIO udp = new UdpIO();
CurrentIODevice = serial;
}
}
У меня также есть класс IOManager
, который содержит несколько объектов IO
.
public class IOManager
{
List<IO> Ports = new List<IO>();
public IOManager()
{
Ports.Add(new IO());
Ports.Add(new IO());
}
Ports[0].CurrentIODevice = serial;
Ports[0].CurrentIODevice.DataReceivedHandler += MyGuiUpdate;
Ports[0].CurrentIODevice.DataReceivedHandler += MyDataProcessing;
}
Мое беспокойство (это не проблема atm) заключается в том, как я буду менять разные интерфейсы IDataIO во время выполнения.
Каков эффект во время выполнения, выполняющий следующий оператор:
//i know this is illegal but just to demonstrate
IOManager.Ports[0].CurrentIODevice = tcp;
Будут ли выполняться обработчики событий (и правильно)?
Нужно ли переназначать события перед назначением CurrentIODevice, а затем снова назначать обработчики после? Если это так, я вижу, что этот подход становится довольно грязным, поэтому, если у кого-то есть лучший подход к этой проблеме, я все уши:)