class - multiple - Contrato de interfaz, objeto de clase?
ejercicios resueltos de clases abstractas en java (6)
¿El contrato a la interfaz como objeto es a la clase?
¿Cuál es la necesidad de diferenciar cosas idénticas como esta, desde el código hasta el código de ejecución? En cierto modo, tengo la idea de nombrar a una clase una clase y a la clase de ejecución instanciada como un objeto, pero en general, ¿esa es la única razón para estos términos semi redundantes?
"Clase" y "Objeto" representan dos cosas diferentes; están relacionados, pero lo que representan ES diferente, bastante fuerte.
La mejor manera de describir esto es mirar Estático. Una clase puede tener miembros estáticos, que están completamente separados de cualquier INSTANCIA de esa clase. Los objetos de esa clase pueden o no usar esos miembros estáticos; pero la instancia del objeto de esa clase está completamente separada de cualquier uso estático de esa clase (o debería ser, como mínimo).
O piensa en el patrón singleton. Almacenar una instancia del objeto de clase en un descriptor de clase estático es una práctica común, y muestra la diferencia. Usted se refiere al acceso estático de la clase para obtener la instancia del objeto de una clase singleton; si el miembro estático de la clase no tiene una instancia de objeto a la que referirse, la clase crea la instancia del objeto .
Dicho de otra manera; un objeto es una instancia de una clase; pero una clase puede ser más que una plantilla a partir de la cual se crean instancias de los objetos. Los miembros estáticos de las clases tienen una representación en la memoria que es completamente independiente de las instancias de objetos de esas clases.
Bueno, supongo ... si una interfaz especifica un contrato, una clase especifica una (o varias) instancia (s) de un objeto en particular.
Sin embargo, la terminología es menos importante que la aplicación.
En realidad, una interfaz es un contrato, cuando un objeto es una instancia de una clase: son cosas diferentes que no tienen demasiado en común.
La interfaz solo proporciona una fachada para los objetos, o una garantía para la persona que llama que el objeto puede hacer alguna operación, incluso sin saber su implementación.
Por ejemplo, puede tener dos clases que implementen la misma interfaz / contrato, pero hagan cosas totalmente diferentes (aunque el significado de hacerlas sea el mismo).
Tome la interfaz IDisposable por ejemplo: cada objeto puede liberar los recursos que utiliza, pero puede hacerlo de muchas maneras diferentes, puede elegir no lanzar nada. Es la elección del objeto.
Al menos este sería el POV en .NET
Para completar las respuestas anteriores, una palabra sobre interfaces:
Si la clase es más que una plantilla para un objeto (debido a sus características globales independientes de cualquier instancia), la interfaz también se puede describir como un punto de vista
Una clase que implementa varias interfaces:
- completar el contrato que necesita respetar
- Permitir al usuario ver cualquier instancia de esa clase desde el punto de vista de la que representa la interfaz implementada.
"Punto de vista" significa que puede usar un objeto al centrarse únicamente en el contrato definido por esa interfaz.
Es en ese aspecto que una interfaz es una "clase abstracta", como en una "abstracción" (algo que toma después algunas de las características de una clase, pero deja algunas fuera). En el mundo java, una interfaz deja mucho en realidad, ya que solo se puede aplicar para definir contratos, por ejemplo, no para métodos o funciones estáticas.
Realmente no. Aquí hay cuatro términos, así que repasaré cada uno de ellos:
Interfaz
Una interfaz es una clase abstracta (en idiomas como Java donde no hay herencia múltiple, a veces hay otras restricciones, como un tipo de datos separado) que se pretende usar como base común para acceder a una cantidad de objetos que se comportan de manera similar. . Conceptualmente, no existe un requisito de abstracción, pero generalmente, una interfaz tendrá al menos un método abstracto. Una interfaz es un método para que su programa se comunique con una cantidad de clases similares, cada una con una semántica diferente pero con el mismo propósito general.
Contrato
Un contrato es el acuerdo implícito que usted establece entre los usuarios y los implementadores de una clase o interfaz. Por ejemplo, las precondiciones y las postcondiciones (invariantes suelen ser un contrato dentro de la implementación de la clase; en general, no es necesario exponer cosas como la relación entre miembros internos). La especificación para un valor de retorno o un argumento también puede ser parte del contrato. Básicamente representa cómo usar la función / clase / interfaz, y generalmente no es totalmente representable en ningún idioma (algunos idiomas, como Eiffel, le permiten poner contratos explícitos, pero incluso estos no siempre pueden detallar los requisitos). ) Cuando implementa una interfaz o deriva de una clase, siempre tiene que cumplir con los requisitos de la interfaz o, al anular una clase no abstracta, comportarse de manera similar que un espectador externo no nota la diferencia (este es el Liskov Principio de sustitución: un objeto derivado debería ser capaz de reemplazar la base sin ninguna diferencia de comportamiento desde la perspectiva externa).
Clase
Una clase no necesita una gran cantidad de repaso, ya que claramente los has usado antes. Una clase es el tipo de datos, y en algunos idiomas es un superconjunto de interfaces (que no tienen una definición formal, como en C ++), y en otros es independiente (como en Java).
Objeto
Un objeto es una instancia de un tipo de clase (o de cualquier tipo que no sea de clase, por lo general). La definición exacta de un objeto es muy específica para un idioma, pero la definición general es la referencia real de múltiples referencias / punteros a la misma cosa; por ejemplo, en algunos lenguajes como Java, == compara si dos variables son la mismo objeto, no necesariamente si son semánticamente iguales. Los objetos son independientes de las clases o interfaces, representan una sola instancia. Otra forma de pensar es que la clase o la interfaz es el molde, y el objeto es el objeto físico que sale del molde (una analogía bastante mala, pero es lo mejor que puedo hacer en este momento).
No en realidad no. Una clase es una plantilla que usted define. Cada objeto que crea una instancia de esa clase sigue la plantilla. No son realmente términos redundantes, porque las dos cosas no son idénticas. Puede pensar en una clase como un tipo de datos definido por el usuario. Las clases y los objetos son diferentes entre sí de la misma manera que el tipo de datos primitivo int
es diferente del valor literal 3.
Una interfaz define un conjunto de métodos que todas las clases de implementación deben admitir. La interfaz en sí es el contrato que define para las clases de implementación. Simplemente dice que cualquier clase que implemente la interfaz debe tener el conjunto de métodos públicos de esa interfaz.