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 interface
qui 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 interface
vous 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.Serializable
et java.lang.Cloneable
; ces deux interface
signifient des choses très différentes, mais ils ont exactement la même signature.
Donc, si deux interface
s que les choses moyennes différentes, ont la même signature, ce exactement est la interface
mê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
element
est dans la collection
Et lequel de ceux-ci apparaît réellement dans le interface
? Aucun! Il n'y a rien dans le interface
qui dit que la Add
mé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 sort
fonction 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 class
est, ou ce module
dans 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 Array
ou un String
au lieu d'un plus compliqué Logger
, même si Array
et Logger
ne 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 IO
et donc une grande partie de l' Interface de File
, mais sans partager d'ailleurs aucun ancêtre commun Object
.