web-dev-qa-db-fra.com

Que signifie "contrat" ​​d'une classe

Je lis le livre Le langage de programmation Java . Dans le chapitre qui explique overriding method, on lit:

Rendre une méthode de contournement (en sous-classe) moins accessible qu'en super classe violerait le contrat de la superclasse ...

Le texte dans son ensemble est compréhensible. Ma seule question est ce qui est contrat de la superclasse ? Que signifie le contrat signifie-t-il pour un Java class?

26
Leem.fin

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, de ici : (gras ajouté par moi) 

Ne serait-il pas agréable que toutes les classes Java que vous utilisez, y compris la vôtre , Tiennent leurs promesses? En fait, cela ne serait-il pas agréable si vous Saviez exactement ce que promet une classe donnée? Si vous êtes d'accord, lisez Sur [...]

Conception par contrat

La technique de développement logiciel DBC (Design by Contract) garantit à Un logiciel de haute qualité en garantissant que chaque composant d’un système Est à la hauteur de ses attentes. En tant que développeur utilisant DBC, vous spécifiez Des 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 En attendre.

31
David

Contrat de type (classe, interface, enum) est le, ainsi, le contrat ce type promet de se conformer. Il est dit:

  • quels sont les paramètres acceptables pour le constructeur et/ou les méthodes de ce type;
  • ce que vous devriez ou ne devriez pas attendre de ce type. Par exemple, vous pouvez vous attendre à ce que cette classe soit thread-safe ou non thread-safe;
  • quels sont les invariants supportés par ce type. Par exemple, la méthode addData(float) de la classe MathAverage 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.
  • d'une manière générale, votre type peut spécifier n'importe quelle contrainte que tous ses sous-types doivent respecter. Par exemple, il peut indiquer "aucune méthode de ce type ne doit prendre plus d'une seconde pour s'exécuter".

Le contrat est spécifié sous forme libre dans javadoc de type. Il existe certains outils/pratiques pour imposer l'exécution de contrats, mais ils sont limités, précisément parce que le contrat peut être arbitraire, voire contradictoire en cas d'erreur du programmeur.

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

Un autre aspect important concernant le type de contrat est que le sous-type peut avoir plus fort contrat (couvrant un sous-ensemble de contraintes dans le contrat de type), mais ne peut pas avoir plus faible contrat (couvrant un sur-ensemble de contraintes dans le contrat de type). ____.] Par exemple, si la méthode de votre type 'doX (n)' promet de prendre O(n) (linéaire) temps, 'doX (n)' dans le sous-type peut prendre O(1) (constant), mais ne peut pas prendre O(n^2).

5
Victor Sorokin

Le "contrat" ​​d'une classe est son interface publique ou du moins l'interface si elle est présentée à des classes autres que la sienne.

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

3
cdeszaq

Cela signifie que la méthode surchargeant 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
jontro

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 dans Conception par contrat page wikipedia

0
Mansuro

en termes simples, cela signifie que vous rompriez les conditions de la superclasse si vous rendiez le code de contournement moins accessible

0
sum2000

Le contrat d’une classe ou d’une interface, en Java ou dans un autre langage OO, fait généralement référence aux méthodes (ou fonctions) et aux propriétés (ou aux champs) ou aux attributs (les) de cette classe classées par l’interface avec tous les commentaires ou la documentation qui s'appliquent à ces méthodes et propriétés publiques.

Dans le cas de la relation entre une classe et une sous-classe, toute méthode ou propriété protégée serait considérée comme "exposée publiquement", en ce sens qu'elle serait exposée à la sous-classe.

0
dgvid

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

Fondamentalement, si vous rompez votre contrat avec une classe, il n’est pas obligé de se comporter comme vous le souhaiteriez. De l’autre côté, la classe a promis que si vous respectiez les règles énoncées, elle se comporterait de la manière indiquée par son API.

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

0
Pops