La clase abstracta y la interfaz son dos mecanismos en el lenguaje Java que admiten definiciones de clases abstractas. Es precisamente debido a la existencia de estos dos mecanismos que Java tiene poderosas capacidades orientadas a objetos. Existen grandes similitudes entre la clase abstracta y la interfaz en términos de soporte para la definición de clases abstractas, e incluso pueden reemplazarse entre sí. Por lo tanto, muchos desarrolladores parecen ser más informales a la hora de elegir la clase abstracta y la interfaz al definir clases abstractas. De hecho, todavía existe una gran diferencia entre los dos. Su elección refleja incluso la comprensión de la naturaleza del dominio del problema y si la comprensión de la intención del diseño es correcta y razonable. Este artículo analizará las diferencias entre ellos e intentará proporcionar a los desarrolladores una base para elegir entre los dos.
Comprender las clases abstractas
La clase abstracta y la interfaz se utilizan para crear clases abstractas en el lenguaje Java (la clase abstracta en este artículo no se traduce de la clase abstracta, representa un cuerpo abstracto y la clase abstracta es un método utilizado para definir clases abstractas en el lenguaje Java), lectores preste atención para distinguir) definición, entonces, ¿qué es una clase abstracta y qué beneficios puede traernos el uso de clases abstractas?
En el concepto orientado a objetos, sabemos que todos los objetos están representados por clases, pero lo contrario no es cierto. No todas las clases se utilizan para describir objetos. Si una clase no contiene suficiente información para describir un objeto específico, dicha clase es una clase abstracta. Las clases abstractas se utilizan a menudo para representar conceptos abstractos que derivamos del análisis y diseño de áreas problemáticas. Son abstracciones de una serie de conceptos específicos que parecen diferentes pero que son esencialmente iguales. Por ejemplo: si desarrollamos un software de edición de gráficos, encontraremos que hay algunos conceptos específicos como círculos y triángulos en el dominio del problema. Son diferentes, pero todos pertenecen al concepto de forma. en el dominio del problema, si existe, es un concepto abstracto. Precisamente porque los conceptos abstractos no tienen conceptos concretos correspondientes en el dominio del problema, no se pueden crear instancias de las clases abstractas utilizadas para representar conceptos abstractos.
En el campo orientado a objetos, las clases abstractas se utilizan principalmente para ocultar tipos. Podemos construir una descripción abstracta de un conjunto fijo de comportamientos, pero este conjunto de comportamientos puede tener cualquier número de implementaciones concretas posibles. Esta descripción abstracta es la clase abstracta, y este conjunto de posibles implementaciones concretas está representado por todas las clases derivadas posibles. Los módulos pueden operar sobre un cuerpo abstracto. Debido a que un módulo se basa en una abstracción fija, no se puede modificar al mismo tiempo; el comportamiento de este módulo también se puede ampliar derivando de esta abstracción; Los lectores que estén familiarizados con OCP deben saber que para implementar OCP (Open-ClosedPrinciple), uno de los principios básicos del diseño orientado a objetos, las clases abstractas son la clave.
Mirando la clase abstracta y la interfaz desde el nivel de definición gramatical
A nivel gramatical, el lenguaje Java proporciona diferentes definiciones para clase abstracta e interfaz. El siguiente es un ejemplo de definición de una clase abstracta denominada Demo para ilustrar esta diferencia.
La forma de definir la clase abstracta Demo usando abstractclass es la siguiente:
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. 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.
Hay otro problema grave al no poder definir el comportamiento predeterminado en una clase abstracta, y es que puede causar problemas de mantenimiento. Porque si luego desea modificar la interfaz de la clase (generalmente representada por clase abstracta o interfaz) para adaptarla a nuevas situaciones (por ejemplo, agregar nuevos métodos o agregar nuevos parámetros a los métodos existentes), será muy problemático y puede Lleva mucho tiempo (especialmente cuando hay muchas clases derivadas). Pero si la interfaz se implementa a través de abstractclass, es posible que solo necesite modificar el comportamiento predeterminado definido en abstractclass.
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", lo que resultará en la duplicación de código, lo que tampoco es propicio. al mantenimiento futuro. Por lo tanto, tenga mucho cuidado al elegir entre clase abstracta e interfaz.
Mirando la clase abstracta y la interfaz desde la perspectiva de los conceptos de diseño. Lo anterior analiza principalmente las diferencias entre la clase abstracta y la interfaz desde la perspectiva de la definición gramatical y la programación. Las diferencias en estos niveles son de nivel relativamente bajo y no esenciales. Esta sección analizará la diferencia entre clase abstracta e interfaz desde otro nivel: los conceptos de diseño reflejados por las dos. El autor cree que