Ruby a des interfaces comme n'importe quel autre langage.
Notez qu'il faut faire attention à ne pas confondre le concept d' Interface , qui est une spécification abstraite des responsabilités, garanties et protocoles d'une unité avec le concept de interfacequi est un mot-clé dans la programmation Java, C # et VB.NET langues. Dans Ruby, nous utilisons le premier tout le temps, mais le second n'existe tout simplement pas.
Il est très important de distinguer les deux. Ce qui est important, c'est l' interface , pas le interface. Le ne interfacevous dit quasiment rien d'utile. Rien ne le démontre mieux que les interfaces de marqueurs en Java, qui sont des interfaces qui n'ont aucun membre: il suffit de jeter un œil à java.io.Serializableet java.lang.Cloneable; ces deux interfacesignifient des choses très différentes, mais ils ont exactement la même signature.
Donc, si deux interfaces que les choses moyennes différentes, ont la même signature, ce exactement est la interfacemême vous garantir?
Un autre bon exemple:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
Quelle est l' interface de java.util.List<E>.add?
- que la longueur de la collection ne diminue pas
- que tous les objets qui étaient dans la collection avant sont toujours là
- qui
elementest dans la collection
Et lequel de ceux-ci apparaît réellement dans le interface? Aucun! Il n'y a rien dans le interfacequi dit que la Addméthode doit même ajouter du tout, elle pourrait tout aussi bien supprimer un élément de la collection.
C'est une implémentation parfaitement valide de cela interface:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
Un autre exemple: où java.util.Set<E>est-il dit qu'il s'agit, vous savez, d'un ensemble ? Nulle part! Ou plus précisément, dans la documentation. En anglais.
Dans presque tous les cas interfaces, à la fois à partir de Java et .NET, toutes les informations pertinentes se trouvent en fait dans la documentation, pas dans les types. Donc, si les types ne vous disent rien d'intéressant de toute façon, pourquoi les garder du tout? Pourquoi ne pas s'en tenir uniquement à la documentation? Et c'est exactement ce que fait Ruby.
Notez qu'il existe d' autres langages dans lesquels l' interface peut en fait être décrite de manière significative. Cependant, ces langages n'appellent généralement pas la construction qui décrit l' interface " interface", ils l'appellent type. Dans un langage de programmation à typage dépendant, vous pouvez, par exemple, exprimer les propriétés qu'une sortfonction renvoie une collection de la même longueur que l'original, que chaque élément qui est dans l'original est également dans la collection triée et qu'aucun élément plus grand apparaît devant un élément plus petit.
Donc, en bref: Ruby n'a pas d'équivalent à un Java interface. Il ne , cependant, ont un équivalent à Java Interface , et il est exactement le même que dans Java: documentation.
De plus, tout comme en Java, les tests d'acceptation peuvent également être utilisés pour spécifier des interfaces .
En particulier, dans Ruby, l' interface d'un objet est déterminée par ce qu'il peut faire , et non par ce qu'il classest, ou ce moduledans quoi il se mélange. Tout objet qui a une <<méthode peut être ajouté. Ceci est très utile dans les tests unitaires, où vous pouvez simplement passer un Arrayou un Stringau lieu d'un plus compliqué Logger, même si Arrayet Loggerne partagez pas un explicite mis interfaceà part le fait qu'ils ont tous les deux une méthode appelée <<.
Un autre exemple est StringIO, qui implémente la même Interface que IOet donc une grande partie de l' Interface de File, mais sans partager d'ailleurs aucun ancêtre commun Object.