如何从基类调用派生类方法?

时间:2013-04-18 16:49:22

标签: c# derived-class base-class

我已经阅读了几个类似的问题,但似乎没有解决我面临的问题。典型的答案是作为派生类进行转换,但我不能,因为我不知道派生类类型。

以下是我的例子:

class WireLessDevice { // base class
    void websocket.parsemessage(); // inserts data into the wireless device object
}

class WiFi : WireLessDevice { // derived class
    GPSLoc Loc;
}

无线设备也可以用于制作蓝牙,Wi-Max,移动电话等设备,因此我不知道哪种类型的无线设备将接收数据。

当在基类的websocket上收到GPS数据包时,我需要更新派生设备的位置。

我想或许可以通过队列发送消息或创建事件处理程序并在事件参数中发送位置,但是当数据停留在类中时,这些看起来有点笨拙。

语言中是否有内容允许我在不知道类型的情况下从基类调用派生设备?

2 个答案:

答案 0 :(得分:32)

正确的方法是在基类中添加方法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;
}

答案 1 :(得分:2)

Virtual methods将是一个很好的解决方案。您在基类中创建一个方法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套接字代码移动到派生类。