2011-12-16 1 views
23

Estoy leyendo el libro The Java Programming Language. En el capítulo que explica primordial método, que dice:¿Qué significa "contrato" de una clase?

Cómo hacer una método de reemplazo (en la subclase) menos accesible de lo que era en la superclase violaría el contrato de la superclase ...

El texto como un todo es comprensible. Mi única pregunta es ¿qué es contrato de la superclase? ¿Qué significa el contrato para una clase Java?

+0

Consulte ** diseño por contrato ** [en Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) y [en c2.com] (http://wiki.c2.com/?DesignByContract) –

Respuesta

28

Un contrato en una clase Java es similar a un contrato en el mundo real - En términos no técnicos:

Es un acuerdo que la clase expondrá ciertos métodos, ciertas propiedades y ciertos comportamientos.

más técnico, desde here: (negrita agregada por mí)

¿No sería bueno si todas las clases de Java que utiliza, incluyendo su propia , a la altura de sus promesas? De hecho, ¿no sería bueno si realmente supiera exactamente lo que promete una clase determinada? Si está de acuerdo, leer en [...]

Diseño por contrato

El diseño mediante la técnica de contrato (DBC) de desarrollo de software asegura software de alta calidad, garantizando que todos los componentes de un sistema hace honor a sus expectativas. Como desarrollador que usa DBC, especifique contratos de componentes como parte de la interfaz del componente. El contrato especifica qué espera ese componente de los clientes y qué clientes pueden esperar .

+1

¿Hay alguna diferencia entre un contrato y las especificaciones? Parece que el contrato es solo un término humanizado para las especificaciones, ya que las personas acuerdan contratos, pero las máquinas y los procesos se construyen según las especificaciones. (Al menos, en mi interpretación del idioma inglés). – Buttons840

+4

"Especificación" puede tomarse como los detalles de la implementación, es decir, los métodos y propiedades protegidos y privados. "Contrato" realmente significa solo los métodos y propiedades públicos. – dgvid

+0

Lo pienso así: en un proyecto de software, donde contratas un proveedor, hay un contrato para el trabajo que se va a hacer (generalmente bastante general) y (con suerte) un documento de requisitos específicos que es más detallado. La especificación es más similar al documento de requisitos, ya que implementa el contrato, con detalles sobre cómo hacerlo. – David

2

Significa que el método que anula un método en una clase principal o interfaz debe comportarse de la manera que define el contrato.

De lo contrario, el resultado no está definido.

3

El "Contrato" de una clase es su interfaz pública o al menos la interfaz si se presenta en clases distintas a él.

Esto significa que incluye cualquier elemento (métodos, campos, constructores, etc.) que otras clases pueden usar.

0

Hay muchos principios que debe cumplir al programar en Java, o en cualquier lenguaje de programación. Los principios dependen del lenguaje de programación que está usando. Puede saber más sobre contrato en Design by contract wikipedia page

0

en términos simples significa que se rompería las condiciones de superclase si u hacer código de anulación menos accesible

4

contrato del tipo (clase, interfaz de enumeración) es el, así, el contrato este tipo se compromete a cumplir.Establece:

  • cuáles son los parámetros aceptables para el constructor y/o los métodos de este tipo;
  • lo que debe y/o no debe esperar que este tipo esté haciendo. Por ejemplo, puede indicar que debe esperar que esta clase sea segura para subprocesos o que no sea segura para subprocesos;
  • qué son invariantes compatibles con este tipo. Por ejemplo, escriba el método addData(float) de la clase MathAverage, que calcula el promedio de su entrada, y puede indicar que cada vez que devuelve su llamada al add(float), debe esperar que la llamada al MathAverage.getAverage() devuelva el promedio correcto de la entrada actual.
  • en general, su tipo puede especificar cualquier restricción que todos sus subtipos deben seguir. Por ejemplo, puede decir "ningún método de este tipo debe tardar más de 1 segundo en ejecutarse".

Contrato se especifica en forma libre en javadoc de tipo. Existen algunas herramientas/prácticas para hacer cumplir la ejecución de contratos, pero son limitadas, exactamente porque el contrato puede ser arbitrario, o incluso contradictorio, en caso de error del programador.

Dado que la subtipificación (subclases) puede extender/modificar el comportamiento de los métodos de supertipo de manera arbitraria, también puede violar algunas partes del contrato de supertipo. Ejemplo de esto sería extender HashMap, que acepta null valores y claves, con alguna implementación que prohíbe los valores null en las llamadas a sus métodos.

Otro aspecto importante sobre el tipo de contrato es que el subtipo puede tener fuerte contrato (que abarca subconjunto de las restricciones en el contrato del tipo), pero no puede tener más débil contrato (que abarca superconjunto de las restricciones en el contrato del tipo). Por ejemplo, si el método de su tipo 'doX (n)' promete tomar O(n) (lineal) tiempo, 'doX (n)' en subtipo puede tomar O(1) (constante) tiempo, pero no puede tomar O(n^2) tiempo.

0

Es una expresión que proviene de la idea de contratos en el "mundo real".

Básicamente, si rompe su contrato con una clase, entonces no es necesario que se comporte de la manera que podría esperar. Desde la otra dirección, es una promesa de la clase que si sigues las reglas que establece, se comportará de la manera que dice su API.

Un ejemplo común de un contrato en Java está anulando equals() cuando se anula hashCode(). Dos objetos que se consideran iguales deben, por contrato, tener el mismo código hash. Es posible escribir código que sea sintácticamente correcto que no obedezca esto, pero que podría no funcionar correctamente, y eso es culpa del programador que rompió el contrato.

0

El contrato de una clase o interfaz, en Java o cualquier otro lenguaje OO, generalmente se refiere a los métodos expuestos públicamente (o funciones) y propiedades (o campos o atributos) de esa interfaz de clase junto con cualquier comentario o documentación que se aplica a esos métodos y propiedades públicos.

En el caso de la relación entre una clase y una subclase, cualquier método o propiedad protegida se consideraría "públicamente expuesta", en el sentido de que está expuesta a la subclase.

Cuestiones relacionadas