¿Cuál es la diferencia entre interfaz y clase abstracta?
La diferencia entre clases e interfaces abstractas de C#:
1. Una clase es una abstracción de un objeto. Se puede entender que una clase abstracta trata una clase como un objeto. La clase se llama clase abstracta. La interfaz es solo una especificación o regulación de comportamiento. La interfaz personalizada de Microsoft siempre va seguida de un campo capaz, lo que demuestra que expresa una clase "Puedo hacerlo ...". más definido en una serie de clases relacionadas estrechamente relacionadas, la mayoría de las interfaces están vagamente relacionadas pero todas implementan una determinada función
2. Las interfaces básicamente no tienen ninguna característica específica de herencia. Solo prometen métodos que pueden. ser llamado.
3. Una clase puede implementar varias interfaces a la vez, pero solo puede extender una clase principal
4. Las interfaces se pueden usar para admitir devoluciones de llamadas, pero la herencia sí. no tiene esta característica.
5. Las clases abstractas no se pueden sellar.
6. Los métodos específicos implementados por las clases abstractas son virtuales de forma predeterminada, pero los métodos de interfaz en la clase que implementa la interfaz no son virtuales de forma predeterminada. Por supuesto, también puede declararlos como virtuales.
7. (Interfaz) Similar a las clases no abstractas, una clase abstracta también debe proporcionar su propia implementación para todos los miembros de la interfaz enumerados en la lista de clases base de la clase. Sin embargo, las clases abstractas pueden asignar métodos de interfaz a métodos abstractos.
8. Las clases abstractas implementan un principio en programación orientada a objetos, que separa lo mutable y lo inmutable. Las clases e interfaces abstractas se definen como inmutables y se implementan subclases de asientos mutables.
9. Una buena definición de interfaz debe tener una funcionalidad específica en lugar de multifunción, de lo contrario provocará contaminación de la interfaz. Si una clase solo implementa una función de esta interfaz y tiene que implementar otros métodos en la interfaz, se llama contaminación de interfaz.
10. Intente evitar el uso de la herencia para implementar funciones de componentes, pero utilice la reutilización de cajas negras, es decir, la combinación de objetos. Debido a que los niveles de herencia aumentan, la consecuencia más directa es que cuando llamas a una determinada clase en este grupo de clases, ¡debes cargarlas todas en la pila! Las consecuencias se pueden imaginar (comprendido junto con el principio de pila). Al mismo tiempo, los amigos interesados pueden notar que cuando Microsoft crea una clase, a menudo utiliza el método de combinación de objetos. Por ejemplo, en asp.net, la clase Página tiene atributos como Solicitud de servidor, pero en realidad todos son objetos de una determinada clase. Usar este objeto de la clase Página para llamar a métodos y propiedades de otras clases es un principio de diseño muy básico.
11. Si una clase abstracta implementa una interfaz, puede asignar los métodos de la interfaz a la clase abstracta como métodos abstractos sin tener que implementarlos, e implementar los métodos de la interfaz en la subclase de la clase abstracta.
Desde una perspectiva de programación, tanto la clase abstracta como la interfaz se pueden utilizar para implementar la idea de "diseño por contrato". Sin embargo, todavía existen algunas diferencias en el uso específico.
En primer lugar, la clase abstracta representa una relación de herencia en el lenguaje Java, y una clase solo puede usar la relación de herencia una vez (porque Java no admite herencia múltiple - nota de transferencia). Sin embargo, una clase puede implementar múltiples interfaces. Quizás esta sea una consideración de compromiso por parte de los diseñadores del lenguaje Java al considerar el soporte de Java para la herencia múltiple.
En segundo lugar, en la definición de clase abstracta, podemos asignar el comportamiento predeterminado del método. Pero en la definición de interfaz, los métodos no pueden tener un comportamiento predeterminado. Para eludir esta restricción, se deben usar delegados, pero esto agregará algo de complejidad y, a veces, causará muchos problemas.
Existe otro problema grave al no poder definir el comportamiento predeterminado en clases abstractas, y es que puede causar problemas de mantenimiento.
Porque si luego desea modificar la interfaz de la clase (generalmente representada por una clase o interfaz abstracta) para adaptarla a nuevas situaciones (por ejemplo, agregar nuevos métodos o agregar nuevos parámetros a los métodos existentes), puede ser muy problemático. tomar mucho tiempo (especialmente si hay muchas clases derivadas). Pero si la interfaz se implementa a través de una clase abstracta, es posible que solo necesite modificar el comportamiento predeterminado definido en la clase abstracta.
De manera similar, si el comportamiento predeterminado no se puede definir en una clase abstracta, la misma implementación del método aparecerá en cada clase derivada de la clase abstracta, violando el principio de "una regla, un lugar" y provocando la duplicación de El código también es perjudicial para el mantenimiento futuro. Por tanto, tenga mucho cuidado al elegir entre clase abstracta e interfaz.