我看了一下这几款类似的问题,但似乎没有解决我所面临的问题。 典型的回答是投作为派生类,但我不能,因为我不知道派生类类型。
这是我的例子:
class WireLessDevice { // base class
void websocket.parsemessage(); // inserts data into the wireless device object
}
class WiFi : WireLessDevice { // derived class
GPSLoc Loc;
}
无线设备也可以导出,使蓝牙,Wi-Max的,蜂窝等设备,因此我不知道哪种类型的wirelessdevice将是接收数据。
当接收到在网页套接字在基类的一个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
)。 然而,在这种情况下,我会考虑在网络套接字代码转移到派生类。