これに関するいくつかの同様の質問を読みましたが、私が直面している問題を解決するものはありません。典型的な答えは、派生クラスとしてキャストすることですが、派生クラスのタイプがわからないため、できません。
これが私の例です:
class WireLessDevice { // base class
void websocket.parsemessage(); // inserts data into the wireless device object
}
class WiFi : WireLessDevice { // derived class
GPSLoc Loc;
}
Bluetooth、Wi-Max、Cellularなどのデバイスを作成するためにワイヤレスデバイスを派生させることもできるため、どのタイプのワイヤレスデバイスがデータを受信するのかわかりません。
基本クラスのwebsocketでGPSパケットを受信すると、派生したデバイスの位置を更新する必要があります。
キューを介してメッセージを送信するか、イベントハンドラーを作成し、イベント引数で場所を送信することも考えられますが、データがクラス内に留まっている場合は少し不格好に見えます。
型を知らなくても基本クラスから派生デバイスを呼び出すことができるようにする言語に組み込まれているものはありますか?
正しい方法は、基本クラスにメソッドDoSomeMagic()を追加し、デフォルトの実装、または抽象化することです。派生クラスは、それをオーバーライドして魔法を実行する必要があります。
多分このようなもの:
public class WireLessDevice
{ // base class
protected virtual void ParseMessage()
{
// Do common stuff in here
}
}
public class WiFi : WireLessDevice
{ // derived class
override void ParseMessage()
{
base.ParseMessage();//Call this if you need some operations from base impl.
DoGPSStuff();
}
private void DoGPSStuff()
{
//some gps stuff
}
GPSLoc Loc;
}
仮想メソッド が適切なソリューションです。各派生型に共通するすべてのものを処理するメソッドParseMessage
を基本クラスに作成し、特定のデバイスに対してオーバーライドします。
他のメッセージタイプを処理できるようにするには、必要に応じてbase.ParseMessage
を呼び出す必要があります。
class WireLessDevice
{
protected virtual bool ParseMessage(byte[] message)
{
// Inspect message and handle the known ones
return true; // Only if message parsed, otherwise false
}
}
class WiFi : WireLessDevice
{
GPSLoc Loc;
protected override bool ParseMessage(byte[] message)
{
bool messageParsed = base.ParseMessage(message)
if (!messageParsed)
{
// Handle device specific message with GPSLoc
Loc = ...
}
else
{
return false;
}
}
}
基本クラスが他のメッセージを処理していない場合、コードはよりシンプルになります(そして、 abstract
を使用します)。ただし、その場合は、Webソケットコードを派生クラスに移動することを検討します。