Ruby memiliki Antarmuka seperti bahasa lainnya.
Perhatikan bahwa Anda harus berhati-hati untuk tidak menyamakan konsep Antarmuka , yang merupakan spesifikasi abstrak dari tanggung jawab, jaminan, dan protokol dari sebuah unit dengan konsep interface
yang merupakan kata kunci dalam pemrograman Java, C # dan VB.NET bahasa. Di Ruby, kami menggunakan yang pertama sepanjang waktu, tetapi yang terakhir tidak ada.
Sangat penting untuk membedakan keduanya. Yang penting adalah Antarmuka , bukan interface
. Ini interface
memberi tahu Anda tidak ada yang berguna. Tidak ada yang mendemonstrasikan ini lebih baik daripada antarmuka marker di Java, yang merupakan antarmuka yang tidak memiliki anggota sama sekali: lihat saja java.io.Serializable
dan java.lang.Cloneable
; keduanya memiliki interface
arti yang sangat berbeda, namun mereka memiliki tanda tangan yang persis sama .
Jadi, jika dua interface
itu memiliki arti yang berbeda, memiliki tanda tangan yang sama, apa sebenarnya yang interface
menjamin Anda?
Contoh bagus lainnya:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
Apa Antarmuka dari java.util.List<E>.add
?
- agar panjang koleksi tidak berkurang
- bahwa semua barang yang ada di koleksi sebelumnya masih ada
- yang
element
ada di dalam koleksi
Dan yang mana yang benar-benar muncul di interface
? Tidak ada! Tidak ada apa pun di dalamnya interface
yang mengatakan bahwa Add
metode tersebut bahkan harus menambahkan sama sekali, itu mungkin juga menghapus elemen dari koleksi.
Ini adalah implementasi yang sangat valid dari itu interface
:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
Contoh lain: di mana java.util.Set<E>
sebenarnya dikatakan bahwa itu, Anda tahu, satu set ? Tidak kemana-mana! Atau lebih tepatnya, dalam dokumentasi. Dalam Bahasa Inggris.
Di hampir semua kasus interfaces
, baik dari Java dan .NET, semua informasi yang relevan sebenarnya ada di dokumen, bukan di jenisnya. Jadi, jika tipe tidak memberi tahu Anda sesuatu yang menarik, mengapa tetap menyimpannya? Mengapa tidak hanya berpegang pada dokumentasi? Dan itulah yang dilakukan Ruby.
Perhatikan bahwa ada bahasa lain di mana Antarmuka sebenarnya dapat dijelaskan dengan cara yang berarti. Namun, bahasa-bahasa itu biasanya tidak memanggil konstruksi yang mendeskripsikan Antarmuka " interface
", mereka menyebutnya type
. Dalam bahasa pemrograman yang diketik secara dependen, Anda dapat, misalnya, mengekspresikan properti yang sort
dikembalikan oleh suatu fungsi dengan panjang yang sama dengan aslinya, bahwa setiap elemen yang ada dalam aslinya juga ada dalam koleksi yang diurutkan dan tidak ada elemen yang lebih besar. muncul sebelum elemen yang lebih kecil.
Jadi, singkatnya: Ruby tidak memiliki padanan dengan Java interface
. Ini tidak , bagaimanapun, memiliki setara dengan Java Antarmuka , dan itu persis sama dengan di Jawa: dokumentasi.
Juga, seperti di Java, Tes Penerimaan juga dapat digunakan untuk menentukan Antarmuka .
Khususnya, di Ruby, Antarmuka suatu objek ditentukan oleh apa yang dapat dilakukannya , bukan apa class
yang ada, atau apa module
yang digabungkannya. Objek apa pun yang memiliki <<
metode dapat ditambahkan. Ini sangat berguna dalam pengujian unit, di mana Anda dapat dengan mudah meneruskan Array
atau String
bukan yang lebih rumit Logger
, meskipun Array
dan Logger
tidak membagikan eksplisit interface
selain fakta bahwa keduanya memiliki metode yang dipanggil <<
.
Contoh lain adalah StringIO
, yang mengimplementasikan sama Antarmuka sebagai IO
dan dengan demikian sebagian besar dari Antarmuka dari File
, tetapi tanpa berbagi apapun nenek moyang selain Object
.