メッセージ(またはコマンド)を処理するメソッドがあります。ただし、mModuleSimulationは他のクラスのインスタンスであり、このクラスはいくつかの非同期処理を実行します。それが完了すると、結果を別のコンピューターに送信する必要があります。クラスmModuleSimulationは送信方法がわからないため、SendDataメソッドを送信しているので、そのメソッドを簡単に呼び出すことができます。
public void HandleMessage(ITCCommand command, string address)
{
mModuleSimulation.ExecuteReceived(SendData, command.Name, address);
}
internal void SendData(string command, string tcAddress)
{
//DoSend command to address stuff
}
現在、メソッドを渡さなければならないことは十分に悪いことです(少なくとも、それは良い習慣ではないと思いますが、間違っているかもしれません)。ただし、このメソッドSendDataには、送信先のアドレスが必要です。例でわかるように、私は現在それと一緒にアドレスを送っています。
後ですべてが終わったとき、私はそれを次のように呼びます:
SendData.Invoke(message, address);
(SendDataメソッドを変更せずに)行う必要がある方法はありますか?SendData.Invoke(message)
したがって、すべてのメソッドでアドレスを渡す必要はありません。
このようにそれを行うことは可能でしょうか(これは正確には機能しないことを私は知っていますが、それは私が求めていることの感覚を与えるためだけです):
public void HandleMessage(ITCCommand command, string address)
{
Action<string, string> sendDataAction = this.SendData.**SetArgument(arg1 = address)**;
mModuleSimulation.ExecuteReceived(sendDataAction , command.Name);
}
メソッド(または関数)を渡すことは完全に問題ありません-それは流行に戻っています:)
あなたの場合、クロージャは完璧な解決策です。あなたのSendData
方法には2つの引数が必要ですが、あなたは、むしろそれを手動で合格することよりも、引数を取り込むことができます-ラムダ関数は、これは些細ます
public void HandleMessage(ITCCommand command, string address)
{
mModuleSimulation.ExecuteReceived(cmd => SendData(cmd, address), command.Name);
}
internal void SendData(string command, string tcAddress)
{
//DoSend command to address stuff
}
このように、通過するデリゲートはすでにaddress
キャプチャされており、それ自体の署名は単純Action<string>
です。SendData
メソッドの実装の詳細を、ExecuteReceived
正直なところまったく気にしないメソッドから隠しますAction<string>
。単に呼び出したいだけです。
これで不安を感じる場合は、デリゲートが実際に何であるかを考えてください。単純なOOPでは、単一のメソッドでインターフェイスを実装するクラスです。それ以上のOOPを取得することはほとんどできません:D
これは、次のようなことを手動で行うのとまったく同じです。
interface ISendData
{
void SendData(string command);
}
class SendData : ISendData
{
private readonly string address;
public SendData(string address)
{
this.address = address;
}
public void SendData(string command)
{
InternalSendData(command, address);
}
}
public void HandleMessage(ITCCommand command, string address)
{
var mySendData = new SendData(address);
mModuleSimulation.ExecuteReceived(mySendData, command.Name);
}
不要なコードを少し節約するだけです:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加