Este artículo describe el uso de interfaces Java y clases abstractas. Compártelo para su referencia, como sigue:
interfaz
1 Debido a que Java no admite múltiples herencias, con interfaces, una clase solo puede heredar una clase padre, pero puede implementar múltiples interfaces, y la interfaz en sí también puede heredar múltiples interfaces.
2 Las variables miembros en la interfaz son del tipo final público estático de forma predeterminada. Inicialización que debe mostrarse.
3 Los métodos en la interfaz son de abstracto público de forma predeterminada. Declaración implícita.
4 La interfaz no tiene constructor y no puede ser instanciado.
5 Una interfaz no puede implementar otra interfaz, pero puede heredar múltiples interfaces.
6 Si una clase implementa una interfaz, entonces todos los métodos abstractos en la interfaz deben implementarse, de lo contrario, la clase debe definirse como una clase abstracta.
Clase abstracta
1 Si una clase se declara como abstracta, esta clase no puede generar objetos y solo puede usarse heredado.
2 Los métodos abstractos deben existir en clases abstractas.
3 Puede haber variables generales y métodos generales en clases abstractas.
4 Las subclases heredan una clase abstracta deben implementar sus métodos abstractos a menos que la subclase sea una clase abstracta.
Private void print () {}; Esta declaración representa la implementación vacía del método.
resumen vacío imprime (); Esta declaración representa la abstracción del método, sin implementación.
La diferencia entre la interfaz y la clase abstracta
1 La interfaz solo puede contener métodos abstractos, y las clases abstractas pueden contener métodos ordinarios.
2 La interfaz solo puede definir propiedades constantes estáticas. Las clases abstractas pueden definir tanto las propiedades ordinarias como las propiedades constantes estáticas.
3 La interfaz no contiene métodos de constructor, y las clases abstractas pueden contener métodos de constructor.
La clase abstracta no puede ser instanciada, pero no significa que no pueda tener un constructor. La clase abstracta puede tener un constructor y es una clase de reemplazo.
1 La interfaz es el núcleo, que define qué hacer y contiene muchos métodos, pero no define cómo se deben hacer estos métodos.
2 Si muchas clases implementan una interfaz, cada una de ellas necesita implementar esos métodos en el código.
3 Si las implementaciones de algunas clases tienen algo en común, una clase abstracta se puede abstraer para permitir que la clase abstracta implemente el código común de la interfaz, mientras que cada subclase implementa esos métodos personalizados.
Por lo tanto, las clases abstractas están diseñadas para simplificar la implementación de interfaces. No solo proporcionan la implementación de métodos públicos, lo que le permite desarrollarse rápidamente, sino que también permiten que sus clases implementen todos los métodos por sí mismos sin problemas de acoplamiento estrictos.
La aplicación es muy simple
1. Defina las interfaces primero
2 Si hay múltiples implementaciones de interfaz que tienen piezas comunes, usan clases abstractas e integranlas.
La diferencia entre la interfaz y la clase abstracta, creo que no se confundirá después de leerla
Creo que para los programadores que usan lenguajes de programación orientados a objetos, el término "interfaz" debe ser familiar, pero me pregunto si tiene tales dudas: ¿cuál es el propósito de una interfaz? ¿Cuál es la diferencia entre las clases de TI y abstract? ¿Se pueden usar clases abstractas en lugar de interfaces? Además, como programadores, a menudo debe escuchar la frase "programación orientada a la interfaz", entonces, ¿qué significa? ¿Cuál es la connotación ideológica? ¿Cuál es la relación con la programación orientada a objetos? Este artículo responderá a estas preguntas una por una.
1. ¿Cuál es la relación entre la programación orientada a la interfaz y la programación orientada a objetos
En primer lugar, la programación orientada a la interfaz y la programación orientada a objetos no son horizontales. No es una idea de programación independiente que sea más avanzada que la programación orientada a objetos, sino que se adjunta al sistema de pensamiento orientado a objetos y pertenece a su parte. En otras palabras, es una de la esencia del pensamiento en los sistemas de programación orientados a objetos.
2. La naturaleza de la interfaz
Una interfaz está aparentemente compuesta por varias definiciones de métodos sin código de cuerpo. Tiene un nombre único y puede ser implementado por una clase u otra interfaz (o también se puede decir que se hereda). Puede parecer lo siguiente en forma:
interfaz interfacename {void método1 (); método void2 (int para1); Método void3 (cadena para2, cadena para3); }Entonces, ¿cuál es la esencia de una interfaz? ¿O cuál es el significado de la existencia de una interfaz? Creo que se puede considerar desde las siguientes dos perspectivas:
1) Una interfaz es un conjunto de reglas que especifican un conjunto de reglas que debe tener una clase o interfaz que implementa esta interfaz. Encarna el concepto de naturaleza de que "si eres ... debes poder ..."
Por ejemplo, en la naturaleza, las personas pueden comer, es decir, "Si eres humano, debes poder comer". Luego, cuando se simula en un programa de computadora, debe haber una iperson (personalicamente, el nombre de la interfaz comienza con la interfaz "I"), y hay un método llamado Eat (). Luego estipulamos que cada clase que representa "humana" debe implementar la interfaz iperson, que simula la regla natural de "si eres un humano, debes poder comer".
Desde aquí, creo que también puedes ver algunas ideas orientadas a objetos. Uno de los núcleos de pensamiento orientado a objetos es simular el mundo real y abstracto en el mundo real en categorías. Todo el programa se basa en instancias de varios tipos para comunicarse entre sí y cooperar entre sí para completar las funciones del sistema. Esto es muy consistente con las condiciones operativas del mundo real y también es la esencia del pensamiento orientado a objetos.
2) Las interfaces son representaciones abstractas de cosas similares en cierta vista granular. Tenga en cuenta que aquí enfatizo en una cierta visión granular, porque el concepto de "lo mismo" es relativo, y varía debido a diferentes vistas granulares.
Por ejemplo, a mis ojos, soy una persona, y hay una diferencia fundamental entre yo y un cerdo. Puedo aceptar la declaración de que mis compañeros de clase y yo somos los mismos, pero no debo aceptar que soy lo mismo que un cerdo. Sin embargo, si los ojos de un zoólogo son como cerdos, debería ser lo mismo, porque ambos somos animales, puede pensar que tanto "humanos" como "cerdo" han implementado la interfaz Ianimal. Cuando estudia el comportamiento animal, no me tratará a mí y a los cerdos por separado, pero lo estudiará del tamaño de partícula más grande del "animal", pero pensará que existe una diferencia esencial entre yo y un árbol.
Ahora que he cambiado a un genetista, la situación es diferente. Debido a que todos los seres vivos pueden ser heredados, en sus ojos, no solo no soy diferente de los cerdos, sino también de un mosquito, una bacteria, un árbol, un hongo o incluso un virus SARS, porque él pensaría que todos hemos implementado la interfaz idecendible (nota: Descend Vi. Heredancia), es decir, todos estamos heredables. No nos estudiará por separado, pero estudiará a todos los seres vivos como tipos similares. A sus ojos, no hay diferencia entre humanos y virus, solo sustancias heredables y sustancias no heredables. Pero al menos, todavía hay una diferencia entre mí y una piedra.
Pero desafortunadamente, un día, un gran hombre apareció en la tierra, llamado Lenin. Después de estar familiarizado con la obra maestra del materialismo dialéctico de Max y Engels, tenía mucha experiencia, por lo que dio una definición famosa: la llamada asunto es una realidad objetiva que puede reflejarse en la conciencia. En este punto, ya no soy diferente de una piedra, un rastro de aire, un idioma y el campo electromagnético que transmite señales de teléfonos móviles, porque a los ojos de Lenin, todos somos una realidad objetiva que puede reflejarse en la conciencia. Si Lenin fuera un programador, diría esto: el llamado asunto son las instancias generadas por todas las clases que implementan las dos interfaces "Ireflectabe" y "iesse". (Nota: reflejar v. Reflejar Esse n. Realidad objetiva)
Tal vez pienses que mi ejemplo anterior no tiene sentido, pero este es exactamente el significado de la interfaz. Una de las ideas y el núcleo orientado a objetos es el polimorfismo. ¿Qué es el polimorfismo? Para decirlo sin rodeos, es tratar cosas similares indiscriminadamente en cierto nivel de vista granular y manejarlas de manera uniforme. Y la razón por la que me atrevo a hacer esto es porque hay una interfaz. Al igual que ese genetista, entendió que todos los organismos han implementado la interfaz idesable. Mientras sean organismos, debe haber el método Descend (), para que pueda estudiarlos de manera unificada sin estudiar cada organismo por separado y eventualmente agotador.
Tal vez no podamos darle una impresión intuitiva de la naturaleza y la función de la interfaz. Luego, en los siguientes ejemplos y el análisis de varios patrones de diseño, experimentará la connotación de la interfaz de manera más intuitiva.
3. Resumen de programación orientado a la interfaz
A través del artículo anterior, creo que comprende la connotación ideológica de interfaces e interfaces. Entonces, ¿qué es la programación orientada a la interfaz? Mi definición personal es: en el análisis y la arquitectura del sistema, distinguimos jerarquías y dependencias. Cada nivel no proporciona directamente los servicios a su capa superior (es decir, no está directamente instanciada en la capa superior), sino que define un conjunto de interfaces, solo expone sus funciones de interfaz a la capa superior. La capa superior solo depende de la capa inferior y no depende de clases específicas.
Los beneficios de hacer esto son obvios y, en primer lugar, es muy beneficioso para la flexibilidad del sistema. Cuando se debe cambiar la capa inferior, siempre que las funciones de interfaz y interfaz permanezcan sin cambios, la capa superior no necesita hacer ninguna modificación. Incluso puede reemplazar la capa inferior sin cambiar el código de la capa superior, al igual que reemplazamos un disco duro WD 60G con un disco duro Seagate 160 g. No es necesario hacer ningún cambio en otras partes de la computadora, pero simplemente desenchufe el disco duro original y conecte el nuevo disco duro, porque las otras partes de la computadora no confían en el disco duro específico, sino que solo confían en una interfaz IDE. Mientras el disco duro implementa esta interfaz, se puede reemplazar. A partir de aquí, la interfaz en el programa es muy similar a la interfaz en la realidad, por lo que siempre he creído que la interfaz de la palabra es realmente similar.
Otra ventaja del uso de interfaces es que los desarrolladores de diferentes componentes o niveles pueden comenzar la construcción en paralelo, al igual que aquellos que construyen discos duros no necesitan hacer CPU o monitores. Mientras las interfaces sean consistentes y el diseño sea razonable, el desarrollo se puede llevar a cabo en paralelo, mejorando así la eficiencia.
Este artículo vendrá aquí primero. Finalmente, me gustaría decir algo más: la esencia de los objetos orientados es simular la realidad, que también se puede decir que es el alma de mi artículo. Por lo tanto, pensar más en las cosas orientadas a objetos de la realidad será de gran beneficio para mejorar el análisis del sistema y las capacidades de diseño.
En el siguiente artículo, usaré un ejemplo para mostrar los métodos básicos de programación de interfaz.
En el tercer artículo, analizaré algunas ideas de programación orientadas a la interfaz en el patrón de diseño clásico y analizaré las ideas orientadas a la interfaz en la arquitectura jerárquica .NET.
Suplemento a este artículo:
Después de leer cuidadosamente sus respuestas, estoy muy feliz de discutir temas técnicos con usted. Gracias a sus amigos que dieron afirmación, y también a sus amigos que presentaron opiniones y preguntas, lo que me llevó a pensar más profundamente sobre algo y esperar avanzar a través de esto. Aquí me gustaría agregar algo para discutir algunos de los problemas más concentrados en las respuestas.
1. Con respecto a las dos palabras "interfaz" en "programación orientada a la interfaz" y el lenguaje específico orientado a objetos "interfaz"
Vi a un amigo sugiriendo que la palabra "interfaz" en "programación orientada a la interfaz" debería tener un rango más grande que la interfaz en un lenguaje de programación simple. Después de pensarlo, pensé que tenía sentido. Lo que escribí aquí es realmente irrazonable. Creo que la "interfaz" en el lenguaje orientado a objetos se refiere a una estructura de código específica, como una interfaz definida en C# con la palabra clave de la interfaz. Se puede decir que la "interfaz" en "programación orientada a la interfaz" es un componente estructural que se refiere a un nivel más abstracto desde la perspectiva de la arquitectura de software y desde un nivel más abstracto. En este sentido, si se define una clase abstracta y el propósito es lograr el polimorfismo, entonces creo que es razonable llamar a esta clase abstracta también "interfaz". Pero, ¿es razonable usar clases abstractas para implementar el polimorfismo? Discuta en el segundo artículo a continuación.
En resumen, creo que los conceptos de dos "interfaces" son diferentes y relacionados entre sí. Las interfaces en la "programación orientada a la interfaz" son componentes arquitectónicos a nivel ideológico para realizar el polimorfismo, mejorando la flexibilidad y la mantenibilidad del software, mientras que las "interfaces" en lenguajes específicos son los medios para implementar componentes en esta idea en el código.
2. Acerca de las clases e interfaces abstractas
Vi que este era un problema más intenso en la respuesta. Lo siento, no estaba pensando bien en este tema en el artículo. Mi comprensión personal de este problema es la siguiente:
Si observamos solo el código específico, estos dos conceptos son fáciles de ser borrosos, e incluso pensamos que la interfaz es redundante, porque solo por la función específica, excepto por la herencia múltiple (C#, en Java), las clases abstractas parecen ser capaces de reemplazar las interfaces por completo. Sin embargo, ¿es la existencia de interfaces para lograr múltiples herencias? Por supuesto que no. Creo que la diferencia entre clases abstractas e interfaces es la motivación para usar. El uso de clases abstractas es para la reutilización del código, mientras que la motivación para usar interfaces es para el polimorfismo. Entonces, si está dudando sobre si usar una interfaz o una clase abstracta en algún lugar, entonces puede pensar en cuál es su motivación.
Al ver las dudas de un amigo sobre la interfaz iperson, mi comprensión personal es que si la interfaz de Iperson debe definirse depende de la aplicación específica. If there are Women and Man in our project, both inherit Person, and most of the methods of Women and Man are the same, and there is only one method, DoSomethingInWC() is different (the example is vulgar, please forgive me), then of course, it is more reasonable to define an AbstractPerson abstract class, because it can include all other methods, and the subclass only defines DoSomethingInWC(), which greatly reduces the amount of duplicate código.
Sin embargo, si las clases de mujeres y hombres en nuestro programa básicamente no tienen un código común, y hay una clase de mano de persona que necesita instanciarlas, y no quieren saber si son hombres o mujeres, pero solo trátalos como humanos e implementan polimorfismo, entonces es necesario definirlos como interfaces.
En resumen, la diferencia entre una interfaz y una clase abstracta se debe principalmente a la motivación para su uso, no en sí mismo. Cuando una cosa debe definirse como una clase abstracta o una interfaz, debe determinarse en función del contexto del entorno específico.
Además, creo que otra diferencia entre una interfaz y una clase abstracta es que debe haber una relación general y especial entre una clase abstracta y su subclase, mientras que una interfaz es solo un conjunto de reglas que su subclase debe implementar. (Por supuesto, puede haber una relación general y especial, pero el propósito de nuestro uso de interfaces no está aquí). Por ejemplo, es aceptable definir vehículos como clases abstractas y automóviles, aviones y barcos como subclases, porque los automóviles, los aviones y los barcos son todos vehículos especiales. Por ejemplo, la interfaz ICOMParable solo dice que las clases que implementan esta interfaz deben poder compararse, lo cual es una regla. Si la clase de automóvil implementa iComParable, solo significa que hay una manera en nuestro automóvil para comparar dos instancias de automóviles, que pueden ser más caras que qué automóvil o más grande que qué automóvil. No importa, pero no podemos decir que "los autos son especiales y se pueden comparar", lo que no es aplicable gramaticalmente.
Espero que este artículo sea útil para la programación Java de todos.