c# - que - ¿Cómo llamo a un método de clase derivado de la clase base?
que es una clase en c# (2)
La forma correcta es agregar un método DoSomeMagic () en la clase base, con implementación predeterminada o resumen. La clase derivada debe anularla para hacer su magia.
Algo como esto tal vez:
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;
}
He leído varias preguntas similares sobre esto, pero ninguna parece resolver el problema al que me estoy enfrentando. La respuesta típica es emitir como la clase derivada pero no puedo ya que no conozco el tipo de clase derivada.
Aquí está mi ejemplo:
class WireLessDevice { // base class
void websocket.parsemessage(); // inserts data into the wireless device object
}
class WiFi : WireLessDevice { // derived class
GPSLoc Loc;
}
Los dispositivos inalámbricos también pueden derivarse para hacer dispositivos Bluetooth, Wi-Max, celulares, etc. y, por lo tanto, no sé qué tipo de dispositivo inalámbrico recibirá los datos.
Cuando se recibe un paquete GPS en el websocket en la clase base, necesito actualizar la ubicación del dispositivo derivado.
Pensé que tal vez el envío de un mensaje a través de una cola o la creación de un controlador de eventos y el envío de la ubicación en los argumentos del evento, pero parecen un poco confusos cuando los datos permanecen dentro de la clase.
¿Hay algo integrado en el lenguaje que me permita llamar a mi dispositivo derivado desde la clase base sin saber el tipo?
Los métodos virtuales serían una buena solución. Usted crea un método ParseMessage
en la clase base que maneja todas las cosas comunes a cada tipo derivado, y luego lo anula para dispositivos específicos.
Para poder seguir manejando otros tipos de mensajes, deberá llamar a base.ParseMessage
según corresponda:
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 su clase base no está manejando ningún otro mensaje, el código podría ser más simple (y usar abstract
). Sin embargo, en ese caso consideraría mover el código de socket web a la clase derivada.