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 interface
size 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.Serializable
ve java.lang.Cloneable
; Bu iki interface
s demek çok farklı şeyler, ama onlar var tam aynı imzayı.
Öyleyse, interface
farklı ş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
element
koleksiyonda
Ve bunlardan hangisi gerçekte interface
? Yok! İçinde yöntemin hiç eklemesi gerektiğini interface
sö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.interface
type
sort
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 class
olduğunu, ya da ne module
iç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 Array
ya da String
yerine daha karmaşık bir Logger
halde Array
ve Logger
açık bir paylaşmayan interface
ikisi de denilen bir yöntem var aslında dışında <<
.
Bir başka örnek ise StringIO
olan uygular, aynı arabirimi olarak IO
ve 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
.