Quiero saber si una clase puede heredar de una clase y una interfaz. El siguiente código de ejemplo 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, seriales, 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) igual para todas nuestras aplicaciones.
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 según 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;
}
}
fuente
Respuestas:
Si. Tratar:
Nota: La clase base debe aparecer antes de la lista de nombres de interfaz.
Por supuesto, aún necesitará 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 implemente manualmente nuevamente.
fuente
USBDevice : IOurDevice
. Agregar la implementación explícitamente no afecta la clase base, pero puede ayudar a poner énfasis en la interfaz.No, no exactamente Pero puede heredar de una clase e implementar una o más interfaces.
Una terminología clara es importante cuando se discuten conceptos como este. Una de las cosas que verá marcan la escritura de Jon Skeet, por ejemplo, tanto aquí como en forma impresa, es que siempre es preciso en la forma en que describe las cosas.
fuente
Sin relación con la pregunta (la respuesta de Mehrdad debería ayudarlo), y espero que esto no se tome como algo quisquilloso: las clases no heredan las interfaces, las implementan .
.NET no admite la 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 sobre si las interfaces "heredan", "implementan", "requieren" o "traen" interfaces con una declaración como:
La respuesta técnica es que
ITwo
heredaIOne
por algunas razones:ITwo
implementosIOne
es completamente incorrectoITwo
heredaIOne
métodos, siMethodOne()
existe,IOne
entonces también es accesible desdeITwo
. es decir:((ITwo)someObject).MethodOne())
es válido, aunqueITwo
no contiene explícitamente una definición paraMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
devolucionestrue
Finalmente acordamos que las interfaces admiten herencia verdadera / completa. Las características de herencia faltantes (como anulaciones, accesos abstractos / virtuales, etc.) faltan en las interfaces, no en la herencia de la interfaz. Todavía no hace que el concepto sea simple o claro, pero ayuda a comprender lo que realmente está sucediendo bajo el capó en el mundo de Eric :-)
fuente
Encontré la respuesta a la segunda parte de mis preguntas. Sí, una clase puede implementar una interfaz que está en una clase diferente siempre que la interfaz se declare como pública.
fuente
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
, laMyExample
clase implementa una interfaz privada anidada. En otros ejemplos, la interfaz anidada (y la clase que lo contiene) podría serinternal
. Todo depende de quién necesite usarlos y molestarse con ellos.