Ruby ma interfejsy jak każdy inny język.
Zauważ, że musisz uważać, aby nie pomylić koncepcji interfejsu , która jest abstrakcyjną specyfikacją obowiązków, gwarancji i protokołów jednostki z koncepcją, interfacektóra jest słowem kluczowym w programowaniu Java, C # i VB.NET Języki. W Rubim cały czas używamy tego pierwszego, ale drugiego po prostu nie ma.
Rozróżnienie tych dwóch jest bardzo ważne. Ważny jest interfejs , a nie interface. interfacePowie Ci prawie nic pożytecznego. Nic nie pokazuje tego lepiej niż interfejsy znaczników w Javie, które są interfejsami, które nie mają żadnych elementów członkowskich: wystarczy spojrzeć na java.io.Serializablei java.lang.Cloneable; te dwa interfaceoznaczają bardzo różne rzeczy, ale mają dokładnie ten sam podpis.
Tak więc, jeśli dwie interfaces, które mają różne znaczenie mają ten sam podpis, co dokładnie jest interfacenawet gwarantując ci?
Kolejny dobry przykład:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
Co to jest interfejs z java.util.List<E>.add?
- że długość kolekcji się nie zmniejsza
- że wszystkie przedmioty, które były w kolekcji wcześniej, nadal tam są
- to
elementjest w kolekcji
A który z nich faktycznie pojawia się w interface? Żaden! Nic w interfacetym nie mówi, że Addmetoda musi w ogóle dodawać , równie dobrze mogłaby usunąć element z kolekcji.
Jest to całkowicie poprawna realizacja tego interface:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
Inny przykład: gdzie w java.util.Set<E>rzeczywistości jest napisane, że jest to zestaw ? Nigdzie! A dokładniej w dokumentacji. Po angielsku.
Prawie we wszystkich przypadkach interfaces, zarówno z języka Java, jak i .NET, wszystkie istotne informacje znajdują się w dokumentacji, a nie w typach. Więc jeśli typy i tak nie mówią ci nic interesującego, po co je w ogóle trzymać? Dlaczego nie trzymać się tylko dokumentacji? I to jest dokładnie to, co robi Ruby.
Zwróć uwagę, że istnieją inne języki, w których interfejs można faktycznie opisać w zrozumiały sposób. Jednak te języki zazwyczaj nie wywołują konstrukcji opisującej interfejs " interface", nazywają ją type. W języku programowania z typami zależnymi możesz na przykład wyrazić właściwości, że sortfunkcja zwraca kolekcję o tej samej długości co oryginał, że każdy element, który jest w oryginale, również znajduje się w posortowanej kolekcji i nie ma większego elementu pojawia się przed mniejszym elementem.
Krótko mówiąc: Ruby nie ma odpowiednika w Javie interface. To nie mają jednak odpowiednikiem Java interfejs i jest dokładnie taka sama jak w Javie: dokumentacja.
Podobnie jak w Javie, testy akceptacji mogą być również używane do określania interfejsów .
W szczególności w języku Ruby interfejs obiektu jest określany przez to, co może zrobić , a nie przez to , co classjest lub z czym modulesię miesza. Do każdego obiektu, który ma <<metodę, można dołączyć. Jest to bardzo przydatne w testach jednostkowych, w których można po prostu przekazać komendę Arraylub a Stringzamiast bardziej skomplikowanej Logger, nawet jeśli Arrayi Loggernie udostępniać jawnego, interfacepoza tym, że oba mają metodę nazwaną <<.
Innym przykładem jest to StringIO, który realizuje te same interfejsu a IO, a tym samym duża część interfejsu z File, ale nie dzielą każdą oprócz wspólnego przodka Object.