Pregunta

¿El contrato para interactuar como el objeto es para la clase?

¿Cuál es la necesidad de diferenciar cosas idénticas como esta, del código al código de ejecución? De alguna manera, tengo la idea de nombrar a una clase una clase y a la instancia ejecutada clase un objeto, pero en general, ¿es esa la única razón para estos términos semi-redundantes?

¿Fue útil?

Solución

En realidad no. Aquí hay cuatro términos, así que repasaré cada uno de ellos:

Interfaz

Una interfaz es una clase abstracta (en lenguajes como Java donde no hay herencia múltiple, a veces hay otras restricciones, como un tipo de datos separado) que se pretende utilizar como una base común para acceder a un número similar -tener objetos. Conceptualmente, no hay ningún 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 varias 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 se establece entre los usuarios y los implementadores de una clase o interfaz. Por ejemplo, condiciones previas y condiciones posteriores (las invariantes generalmente son un contrato dentro de la implementación de la clase; en general, no es necesario exponer cosas como la relación entre los 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 incluir contratos explícitos, pero incluso estos no siempre pueden completar los requisitos) ). Cuando implementas una interfaz o derivas de una clase, siempre tienes que cumplir con los requisitos de la interfaz o, al reemplazar una clase no abstracta, comportarte de manera tan similar como para que un espectador externo no note la diferencia (este es el Liskov Principio de sustitución: un objeto derivado debe ser capaz de reemplazar la base sin diferencia de comportamiento desde la perspectiva externa).

Clase

Una clase no necesita repasar mucho, 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, generalmente). La definición exacta de un objeto es muy específica para un idioma, pero la definición general es la cosa real a la que se refieren varias referencias / punteros a la misma cosa, por ejemplo, en algunos idiomas como Java, == compara si dos variables son las mismo objeto, no necesariamente si son semánticamente iguales. Los objetos son independientes de las clases o interfaces, representan una instancia única. Otra forma de verlo 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 la mejor que puedo encontrar en este momento).

Otros consejos

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 términos realmente 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 primitivos 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í misma es el contrato que usted 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.

Bueno, supongo ... si una interfaz especifica un contrato que una clase especifica una (o varias) instancia (s) de un objeto en particular.

La terminología es menos importante que la aplicación, sin embargo.

En realidad, una interfaz es un contrato, cuando un objeto es una instancia de una clase, son cosas diferentes que no tienen mucho en común.

La interfaz solo proporciona una fachada para los objetos, o una garantía para la persona que llama de que el objeto puede realizar alguna operación, incluso sin saber su implementación.

Por ejemplo, puede tener dos clases implementando la misma interfaz / contrato, pero hacer cosas totalmente diferentes (aunque el significado de hacerlas sea el mismo).

Tome la interfaz IDisposable, por ejemplo: cada objeto puede liberar los recursos que usa, pero puede hacerlo de muchas maneras diferentes, puede elegir no liberar nada. Es la elección del objeto.

Al menos este sería el punto de vista en .NET

Para completar las respuestas anteriores, una palabra acerca de las 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:

  • complete el contrato que debe respetar
  • permite al usuario ver cualquier instancia de esa clase desde el punto de vista del representado por la interfaz implementada.

" Punto de vista " significa que puede usar un objeto centrándose únicamente en el contrato definido por esa interfaz.

Es en ese aspecto que una interfaz es una " clase abstracta " ;, como en " abstracción " (algo que toma después de algunas de las características de una clase, pero deja algunas otras). En el mundo de Java, una interfaz deja mucho espacio, ya que solo se puede aplicar para definir contratos, por ejemplo, no para métodos o funciones estáticas.

" Clase " y " Objeto " representan dos cosas diferentes; están relacionados, pero lo que representan es diferente, con bastante fuerza.

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, por lo menos).

O piensa en el patrón de singleton. Almacenar una instancia del objeto de clase en un descriptor de acceso de clase estática es una práctica común y muestra la diferencia. Se refiere al acceso estático de clase para obtener la instancia de objeto de una clase singleton; si el miembro estático de la clase no tiene una instancia de objeto para referirse, la clase crea la instancia de la objeto .

Dicho de otra manera; un objeto es una instancia de una clase; pero una clase puede ser más que solo una plantilla desde la cual se crea una instancia 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 objeto de esas clases.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top