IDataIOというインターフェイスがあります。
public interface IDataIO
{
event DataReceivedEvent DataReceived;
//.....more events,methods and properties
}
このインターフェイスを実装する複数のクラス、つまり、、もUdpIO
ありTcpIO
ますSerialIO
。
これで、IO
異なる入出力ハードウェアを切り替えることができるクラスができました。このクラスの各インスタンスには、、、またはのいずれかのプロパティがCurrentIODevice
あります。このプロパティが割り当てられると、1つ以上のハンドラーをアタッチして、受信データが受信されたときにGUIに通知されるようにします。また、通知が必要な他のクラスも通知します。SerialIO
UdpIO
TcpIO
DataReceivedEvent
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が割り当てられる前にイベントの割り当てを解除し、その後でハンドラーを再度割り当てる必要がありますか?これが事実である場合、私はこのアプローチがかなり厄介になっているのを見ることができるので、誰かがこの問題に対してより良いアプローチを持っているなら、私はすべての耳です:)