Ruby, diğer dillerde olduğu gibi Arayüzlere sahiptir .
Bir birimin sorumluluklarının, garantilerinin ve protokollerinin soyut bir belirtimi olan Arayüz kavramını interface, Java, C # ve VB.NET programlamasında anahtar kelime olan kavramı ile birleştirmemeye dikkat etmeniz gerektiğini unutmayın. Diller. Ruby'de her zaman ilkini kullanırız, ancak ikincisi basitçe mevcut değildir.
İkisini birbirinden ayırmak çok önemli. Asıl önemli olan ise Arayüz değil interface. Bu interfacesize hemen hemen hiçbir işe yaramaz. Bunu hiçbir üyesi olmayan Java arabirimlerinden daha iyi gösteren hiçbir şey yoktur: sadece bir göz atın java.io.Serializableve java.lang.Cloneable; Bu iki interfaces demek çok farklı şeyler, ama onlar var tam aynı imzayı.
Öyleyse, interfacefarklı şeyler ifade eden iki kelime aynı imzaya sahipse , sizi garanti eden tam olarakinterface nedir?
Bir başka güzel örnek:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
Nedir Arayüz ait java.util.List<E>.add?
- koleksiyonun uzunluğunun azalmaması
- daha önce koleksiyonda bulunan tüm öğelerin hala orada olduğunu
- bu
elementkoleksiyonda
Ve bunlardan hangisi gerçekte interface? Yok! İçinde yöntemin hiç eklemesi gerektiğini interfacesöyleyen hiçbir şey yok , aynı zamanda koleksiyondan bir öğeyi kaldırabilir .Add
Bu, bunun tamamen geçerli bir uygulamasıdır interface:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
Başka bir örnek: java.util.Set<E>gerçekte nerede bir set olduğunu söylüyor ? Hiçbir yerde! Veya daha doğrusu, belgelerde. İngilizcede.
Hemen hemen tüm durumlarda interfaces, hem Java hem de .NET'te, tüm ilgili bilgiler aslında türlerde değil, belgelerde bulunur. Öyleyse, türler zaten size ilginç bir şey söylemiyorsa, neden onları hiç tutmasın? Neden sadece belgelere bağlı kalmıyorsunuz? Ve işte Ruby tam olarak bunu yapar.
Arayüzün gerçekten anlamlı bir şekilde tanımlanabileceği başka diller de olduğunu unutmayın . Ancak, bu diller tipik olarak Arayüzü tanımlayan yapıyı " " olarak adlandırmazlar, buna " " denir . Bağımlı olarak yazılmış bir programlama dilinde, örneğin, bir fonksiyonun orijinalle aynı uzunlukta bir koleksiyon döndürdüğü, orijinaldeki her öğenin de sıralanmış koleksiyonda yer aldığını ve daha büyük bir öğe olmadığını ifade edebilirsiniz. daha küçük bir elemanın önünde görünür.interfacetypesort
Yani kısaca: Ruby'nin bir Java'ya eşdeğeri yoktur interface. Bu vermez , ancak, bir Java eşdeğer olması Arayüzü ve tam olarak Java aynıdır: dokümantasyonu.
Ayrıca Java'da olduğu gibi, Kabul Testleri de Arayüzleri belirlemek için kullanılabilir .
Özellikle, Ruby, Arayüz bir nesnenin o ne göre belirlenir yapmak değil, neyi classolduğunu, ya da ne moduleiçeri karıştırır. Bir sahip olan her nesne <<yöntemi eklenebilir. Bu sadece bir in geçebilir ünite testleri, çok faydalıdır Arrayya da Stringyerine daha karmaşık bir Loggerhalde Arrayve Loggeraçık bir paylaşmayan interfaceikisi de denilen bir yöntem var aslında dışında <<.
Bir başka örnek ise StringIOolan uygular, aynı arabirimi olarak IOve dolayısıyla büyük bir kısmı arabirimi arasında File, ama bunun yanı sıra, herhangi bir ortak atadan paylaşmayan Object.