En C#, ¿puede una clase heredar de otra clase y una interfaz?


Quiero saber si una clase puede heredar de una clase y una interfaz. El código de ejemplo a continuación no funciona, pero creo que transmite lo que quiero hacer. La razón por la que quiero hacer esto es porque en mi empresa fabricamos dispositivos USB, serie, Ethernet, etc. Estoy tratando de desarrollar un componente/interfaz genérico que pueda usar para escribir programas para todos nuestros dispositivos que ayuden a mantener las cosas comunes (como conectar, desconectar, obtener firmware) iguales para todos nuestros aplicación.

Para agregar a esta pregunta: Si GenericDevice está en un proyecto diferente, ¿puedo poner la interfaz IOurDevices en ese proyecto y luego hacer que la clase USBDevice implemente la interfaz si agrego una referencia al primer proyecto? Porque me gustaría simplemente hacer referencia a un proyecto y luego implementar diferentes interfaces dependiendo de lo que es el dispositivo.

class GenericDevice
{
   private string _connectionState;
   public connectionState
   {
      get{return _connectionState; }
      set{ _connectionState = value;}
   }
}

interface IOurDevices
{
   void connectToDevice();
   void DisconnectDevice();
   void GetFirmwareVersion();
}

class USBDevice : IOurDevices : GenericDevice
{
   //here I would define the methods in the interface
   //like this...
   void connectToDevice()
   {
       connectionState = "connected";
   }
}

//so that in my main program I can do this...

class myProgram
{
   main()
   {
      USBDevice myUSB = new USBDevice();
      myUSB.ConnectToDevice;
   }
}
Author: Cœur, 2010-01-13

4 answers

Sí. Try:

class USBDevice : GenericDevice, IOurDevice

Nota: La clase base debe estar antes de la lista de nombres de interfaz.

Por supuesto, todavía tendrá que implementar todos los miembros que definen las interfaces. Sin embargo, si la clase base contiene un miembro que coincide con un miembro de la interfaz, el miembro de la clase base puede funcionar como la implementación del miembro de la interfaz y no es necesario que lo vuelva a implementar manualmente.

 221
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-19 23:10:51

No, no exactamente. Pero puede heredar de una clase y implementar una o más interfaces.

Una terminología clara es importante cuando se discuten conceptos como este. Una de las cosas que verás en la escritura de Jon Skeet, por ejemplo, tanto aquí como en la impresión, es que siempre es preciso en la forma en que describe las cosas.

 19
Author: David M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-13 19:06:17

No está relacionado con la pregunta (la respuesta de Mehrdad debería ayudarte), y espero que esto no se tome como quisquilloso: las clases no heredan interfaces, sino que las implementan.

. NET no admite herencia múltiple, por lo que mantener los términos correctos puede ayudar en la comunicación. Una clase puede heredar de una superclase y puede implementar tantas interfaces como desee.


En respuesta al comentario de Eric... Tuve una discusión con otro desarrollador acerca de si las interfaces "heredan", "implementan", "requieren" o "traen" interfaces con una declaración como:

public interface ITwo : IOne

La respuesta técnica es que ITwo hereda IOne por algunas razones:

  • Interfaces nunca a tiene una implementación, de modo argumentando que ITwo implementa IOne es plana mal
  • ITwo hereda IOne métodos, si MethodOne() existe en IOne, entonces también es accesible desde ITwo. es decir: ((ITwo)someObject).MethodOne()) es válido, incluso aunque ITwo no contiene explícitamente una definición para MethodOne()
  • ...¡porque el tiempo de ejecución lo dice! typeof(IOne).IsAssignableFrom(typeof(ITwo)) devuelve true

Finalmente acordamos que las interfaces soportan herencia verdadera/completa. Las características de herencia que faltan (como anulaciones, accesos abstractos/virtuales, etc.) faltan en las interfaces, no en la herencia de interfaces. Todavía no hace el concepto simple o claro, pero ayuda a entender lo que realmente está pasando bajo el capó en el mundo de Eric :-)

 17
Author: STW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-13 20:14:11

Encontré la respuesta a la segunda parte de mis preguntas. Sí, una clase puede implementar una interfaz que esté en una clase diferente siempre y cuando la interfaz sea declarada como pública.

 1
Author: PICyourBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-13 19:39:33