web-dev-qa-db-fra.com

Comment appeler une méthode de classe dérivée à partir de la classe de base?

J'ai lu plusieurs questions similaires à ce sujet, mais aucune ne semble résoudre le problème auquel je suis confronté. La réponse typique est de transtyper en classe dérivée mais je ne peux pas car je ne connais pas le type de classe dérivée.

Voici mon exemple:

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

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

Le périphérique sans fil peut également être dérivé pour fabriquer des périphériques Bluetooth, Wi-Max, cellulaires, etc. et donc je ne sais pas quel type de périphérique sans fil recevra les données.

Lorsqu'un paquet GPS est reçu sur la prise Web dans la classe de base, je dois mettre à jour l'emplacement de l'appareil dérivé.

Je pensais peut-être envoyer un message via une file d'attente ou créer un gestionnaire d'événements et envoyer l'emplacement dans les arguments d'événement, mais ceux-ci semblent un peu maladroits lorsque les données restent dans la classe.

Y a-t-il quelque chose de intégré dans le langage qui me permettrait d'appeler mon périphérique dérivé de la classe de base sans connaître le type?

18
CramerTV

La bonne façon est d'ajouter une méthode DoSomeMagic () dans la classe de base, avec implémentation par défaut ou abstraite. La classe dérivée devrait alors la remplacer pour faire sa magie.

Quelque chose comme ça peut-être:

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;
}
34
omer schleifer

méthodes virtuelles serait une bonne solution. Vous créez une méthode ParseMessage dans la classe de base qui gère toutes les choses communes à chaque type dérivé, puis remplacez pour des périphériques spécifiques.

Pour pouvoir gérer d'autres types de messages, vous devrez appeler le base.ParseMessage selon le cas:

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;
        }
    }
}

Si votre classe de base ne gère aucun autre message, le code pourrait être plus simple (et utiliser abstract ). Cependant, dans ce cas, j'envisagerais de déplacer le code de socket Web vers la classe dérivée.

2
Thorarin