usan una que programacion polimorfismo las interfaz interfaces implementacion herencia ejemplo derivada como clase abstracta c# class inheritance interface components

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



polimorfismo java (4)

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.

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 genérico / interfaz que pueda usar para escribir programas para todos nuestros dispositivos que ayuden a mantener las mismas cosas (como conectar, desconectar, obtener firmware) para todas nuestras aplicaciones.

Para agregar a esta pregunta: Si GenericDevice está en 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; } }


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

.NET no es compatible con 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 conversación con otro desarrollador sobre 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 varias razones:

  • Las interfaces nunca tienen una implementación, por lo que argumentan que ITwo implementa IOne es completamente erróneo
  • ITwo hereda los métodos IOne , si MethodOne() existe en IOne entonces también es accesible desde ITwo . es decir: ((ITwo)someObject).MethodOne()) es válido, 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 admiten la 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 entender lo que realmente está sucediendo debajo del capó en el mundo de Eric :-)


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

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


Sí. Tratar:

class USBDevice : GenericDevice, IOurDevice

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

Por supuesto, igual 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 de nuevo.