Que signifie "contrat" d'une classe moyenne


Je lis le livre Le langage de programmation Java. Dans le chapitre qui explique la méthode, il est dit:

Rendre une méthode de remplacement (dans la sous-classe) moins accessible qu'elle ne l'était dans la super classe violerait le contrat de la superclasse ...

Le texte dans son ensemble est compréhensible. Ma seule question est qu'est-ce que contrat de la superclasse ? Que signifie le contrat pour une classe Java?

Author: Erick Robertson, 2011-12-16

8 answers

Un contrat dans une classe Java est similaire à un contrat dans le monde réel, En termes non techniques:

C'est un accord que la classe exposera certaines méthodes, certaines propriétés et certains comportements.

Plus technique, à partir de ici : (gras ajouté par moi)

Ce ne serait pas bien si toutes les classes Java que vous utilisez, y compris votre propre, à la hauteur de leurs promesses? En fait, ne serait-ce pas bien si vous en fait savait exactement ce qu'une classe donnée promesses? Si vous êtes d'accord, lire sur [...]

Conception par Contrat

La technique de développement logiciel Design by Contract (DBC) assure logiciel de haute qualité en garantissant que chaque composant d'un système à la hauteur de ses attentes. En tant que développeur utilisant DBC, vous spécifiez contrats de composant dans le cadre de l'interface du composant. Le contrat spécifie ce que ce composant attend des clients et ce que les clients peuvent attendons de lui.

 29
Author: David, 2014-05-04 19:20:26

Contrat de type (classe, interface, enum) est le, bien, le contrat ce type promet de se conformer à. Il indique:

  • quels sont les paramètres acceptables pour le constructeur et/ou les méthodes de ce type;
  • ce que vous devriez et/ou ne devriez pas vous attendre à ce que ce type fasse. Par exemple, il peut indiquer que vous devez vous attendre à ce que cette classe soit thread-safe ou non thread-safe;
  • quels sont les invariants pris en charge par ce type. Par exemple, la méthode de type addData(float) de MathAverage la classe qui calcule la moyenne de son entrée peut indiquer que chaque fois que votre appel à add(float) est renvoyé, vous devez vous attendre à ce que l'appel à MathAverage.getAverage() renvoie la moyenne correcte de l'entrée actuelle.
  • de manière générale, votre type peut spécifier n'importe quelle contrainte tous ses sous-types doivent suivre. Par exemple, il peut dire "aucune méthode de ce type ne doit prendre plus de 1 seconde à exécuter".

Le contrat est spécifié sous forme libre dans javadoc de type. Il existe des outils / pratiques pour appliquer l'exécution de contrats, mais ils sont limités, exactement parce que le contrat peut être arbitraire, ou, même, auto-contradictoire, en cas d'erreur du programmeur.

Étant donné que le sous-typage(sous-classement) peut étendre/modifier le comportement des méthodes supertype de manière arbitraire, il peut également violer certaines parties du contrat de supertype. Un exemple de ceci serait l'extension HashMap, qui accepte les valeurs et les clés null, avec une implémentation qui interdit les valeurs null dans les appels à ses méthodes.

Autres importants l'aspect à propos du contrat de type est que le sous-type peut avoir un contrat plus fort (couvrant le sous-ensemble des contraintes dans le contrat de type), mais ne peut pas avoir un contrat plus faible (couvrant le sur-ensemble des contraintes dans le contrat de type). Par exemple, si la méthode de votre type 'doX(n)' promet de prendre O(n) temps (linéaire), 'doX(n)' dans le sous-type peut prendre O(1) temps (constant), mais ne peut pas prendre O(n^2) temps.

 5
Author: Victor Sorokin, 2011-12-16 18:02:26

Le "contrat" d'une classe est son interface publique ou au moins l'interface si elle est présentée à des classes autres que lui-même.

Cela signifie qu'il inclut tous les éléments (méthodes, champs, constructeurs, etc.) que d'autres classes peuvent utiliser.

 3
Author: cdeszaq, 2011-12-16 16:22:21

Cela signifie que la méthode qui remplace une méthode sur une classe ou une interface parent doit se comporter de la manière définie par le contrat.

Sinon le résultat est indéfini.

 2
Author: jontro, 2011-12-16 16:22:09

Il existe de nombreux principes auxquels vous devez vous conformer lors de la programmation en java ou dans n'importe quel langage de programmation. Les principes dépendent du langage de programmation que vous utilisez. Vous pouvez en savoir plus sur le contrat de Conception par contrat page wikipedia

 0
Author: Mansuro, 2011-12-16 16:26:49

En termes simples, cela signifie que vous briseriez les conditions de la superclasse si vous rendriez le code de remplacement moins accessible

 0
Author: sum2000, 2011-12-16 16:27:44

C'est une expression qui vient de l'idée de contrats dans le "monde réel."

Fondamentalement, si vous rompez votre contrat avec une classe, il n'est pas nécessaire de se comporter comme vous pourriez l'attendre. De l'autre côté, c'est une promesse de la classe que si vous suivez les règles qu'elle définit, elle se comportera comme le dit son API.

Un exemple courant de contrat en Java est de remplacer equals() lorsque hashCode() est remplacé. Deux objets considérés comme égaux doivent, par contrat, avoir le même code de hachage. Il est possible d'écrire du code syntaxiquement correct qui n'obéit pas à cela, mais cela pourrait ne pas fonctionner correctement, et c'est la faute du programmeur qui a rompu le contrat.

 0
Author: Pops, 2011-12-16 16:31:10

Le contrat d'une classe ou d'une interface, en Java ou dans tout autre langage OO, fait généralement référence aux méthodes (ou fonctions) et propriétés (ou champs ou attributs) publiquement exposés de cette interface de classe ainsi qu'à tout commentaire ou documentation qui s'applique à ces méthodes et propriétés publiques.

Dans le cas de la relation entre une classe et une sous-classe, toutes les méthodes ou propriétés protégées seraient considérées comme "exposées publiquement", dans le sens où elles sont exposées à la sous-classe.

 0
Author: dgvid, 2011-12-16 16:49:40