Ruby a des Interfaces comme toute autre langue.
Notez que vous devez être prudent de ne pas confondre le concept de l' Interface, qui est un résumé de la spécification des responsabilités, de garanties et de protocoles d'une unité avec le concept de l' interface
qui est un mot-clé dans le Java, C# et VB.NET les langages de programmation. En Ruby, nous utilisons l'ancien tout le temps, mais celle-ci 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
. L' interface
vous dit presque rien d'utile. Rien ne montre mieux que le marqueur interfaces en Java, qui sont des interfaces qui n'ont pas de membres à tous: il suffit de prendre un coup d'oeil à l' java.io.Serializable
et java.lang.Cloneable
; ces deux - interface
s entend très différentes choses, mais ils ont encore le exactement la même signature.
Ainsi, si deux interface
s qui signifient des choses différentes, ont la même signature, ce qui exactement est l' interface
même en vous garantissant?
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;
}
Qu'est-ce que l' Interface de l' java.util.List<E>.add
?
- que la longueur de la collection ne diminue pas
- que tous les éléments qui étaient dans la collection avant sont toujours là
- qu'
element
est dans la collection
Et celles qui s'affiche en fait dans l' interface
? Aucun! Il n'y a rien dans l' interface
qui dit que l' Add
méthode doit encore ajouter à tout, il peut tout aussi bien supprimer un élément de la collection.
C'est parfaitement valide la mise en œuvre de l' 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ù en java.util.Set<E>
est-ce vraiment dire que c'est, vous le savez, un jeu? Nulle part! Ou plus précisément, dans la documentation. En Anglais.
Dans presque tous les cas d' interfaces
, à la fois à partir de Java et de .NET, tous les pertinentes de l'information est en fait dans les docs, pas dans les types de. Donc, si les types ne peux pas te dire quelque chose d'intéressant, de toute façon, pourquoi les garder? Pourquoi ne pas coller juste pour la documentation? Et c'est exactement ce que Ruby n'.
Notez qu'il existe d'autres langues dans lesquelles l' Interface peut effectivement être décrit d'une manière significative. Cependant, ces langues n'est généralement pas appel de la construction qui décrit l' Interface "interface
", ils l'appellent type
. Dans un dépendante de type de langage de programmation, vous pouvez, par exemple, exprimer les propriétés que l' sort
fonction retourne une collection de la même longueur que l'original, que chaque élément qui est à l'origine, est également dans la collection triée et qu'aucun grand élément apparaît avant un plus petit élément.
Donc, en résumé: Ruby n'a pas d'équivalent à un Java interface
. Il n'a cependant un équivalent Java de l'Interface, et son exactement les mêmes que dans Java: la documentation.
Aussi, tout comme en Java, Tests d'Acceptation peut être utilisé pour spécifier *Interface*s ainsi.
En particulier, dans le Rubis, l' Interface d'un objet est déterminée par ce qu'il peut faire, pas ce que l' class
est est ou ce qu' module
il se mélange. Tout objet qui a un <<
méthode peut être ajouté. Ceci est très utile dans les tests unitaires, où vous pouvez simplement passer un Array
ou String
au lieu d'une plus compliqué Logger
, même si Array
et Logger
ne partagent pas explicite interface
part le fait qu'ils ont tous les deux une méthode appelée <<
.
Un autre exemple est - StringIO
, qui implémentent la même Interface que IO
, et donc une grande partie de l' Interface d' File
, mais sans partager aucun ancêtre commun en plus d' Object
.