2013-04-18 14 views
14

Ho letto molte domande simili a riguardo, ma nessuna sembra risolvere il problema che sto affrontando. La risposta tipica è di eseguire il cast come classe derivata, ma non posso poiché non conosco il tipo di classe derivata.Come si chiama un metodo di classe derivato dalla classe base?

Ecco il mio esempio:

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

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

dispositivo wireless può anche essere derivata per fare Bluetooth, Wi-Max, cellulari, dispositivi ecc e quindi non so quale tipo di wirelessdevice sarà la ricezione dei dati .

Quando un pacchetto GPS viene ricevuto sul websocket nella classe base, è necessario aggiornare la posizione del dispositivo derivato.

Ho pensato di inviare un messaggio tramite una coda o di creare un gestore di eventi e di inviare la posizione negli argomenti dell'evento, ma quelli sembrano un po 'goffi quando i dati restano all'interno della classe.

C'è qualcosa di costruito nel linguaggio che mi consenta di chiamare il mio dispositivo derivato dalla classe base senza conoscerne il tipo?

+0

Dai un'occhiata al motivo decorativo. Il tuo problema sembra essere il tuo design sbagliato. –

+4

Non c'è bisogno di un decoratore ... Dai un'occhiata ai metodi astratti o virtuali ... – Crisfole

risposta

31

Il modo corretto consiste nell'aggiungere un metodo DoSomeMagic() nella classe base, con implementazione predefinita o astratta. La classe derivata dovrebbe ignorarla per fare la sua magia.

Qualcosa di simile forse:

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

+1 per Magic ... – CSharpie

+0

Quindi se chiamo this.setGPSLocation dalla classe base websocket.parsemessage() chiamerà automagicamente il classe derivata 'setGPSLocation? – CramerTV

+0

Non chiamerei SetGPSLocation dalla classe base, ma nella classe derivata. Aggiornerà la mia risposta per dimostrare. –

2

Virtual methods sarebbe una buona soluzione. Si crea un metodo ParseMessage nella classe base che gestisce tutte le cose comuni a ciascun tipo derivato, quindi si sostituisce a dispositivi specifici.

Al fine di essere ancora in grado di gestire altri tipi di messaggio, è necessario chiamare la base.ParseMessage a seconda dei casi:

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

Se la classe di base non gestisce tutti gli altri messaggi, il codice potrebbe essere più semplice (e usando abstract). Tuttavia, in tal caso, prenderei in considerazione lo spostamento del codice socket Web nella classe derivata.

+1

Questa soluzione è simile a quella di Omer e credo che funzionerà per me. Farò un tentativo e aggiornare le risposte. Grazie Thorarin! – CramerTV

+0

@CramerTV Questo è ciò che ottieni per rispondere mentre qualcuno sta modificando il loro post, ma sì è quasi identico. Mi è piaciuta molto la mia spiegazione, quindi ho mantenuto la risposta. – Thorarin

+0

Questo ha funzionato alla grande Thorarin. Ho modificato il tuo valore di ritorno per essere un tipo enumerato in cui il GPS era uno dei valori. In questo modo la routine parseMessage restituirebbe un valore che indicava il tipo di messaggio ricevuto e aggiorno solo la posizione quando il messaggio analizzato corrispondeva alle coordinate GPS (potrei avere altri messaggi di "caso speciale" che devo operare in un secondo momento .) Ho anche incluso un tipo di 'errore' nell'enumerazione in modo da poter riconoscere un errore come il tuo esempio sopra. Grazie per la tua risposta. Ho svalutato entrambi, ma ho scelto la risposta di Omer semplicemente perché era il primo. – CramerTV

Problemi correlati