Ruby มีอินเทอร์เฟซเหมือนกับภาษาอื่น ๆ
โปรดทราบว่าคุณต้องระวังไม่ให้คอนเซ็ปต์ของอินเทอร์เฟซซึ่งเป็นข้อกำหนดนามธรรมของความรับผิดชอบการค้ำประกันและโปรโตคอลของหน่วยที่มีแนวคิดinterfaceซึ่งเป็นคีย์เวิร์ดในการเขียนโปรแกรม Java, C # และ VB.NET ภาษา ใน Ruby เราใช้อดีตตลอดเวลา แต่อย่างหลังไม่มีอยู่จริง
เป็นสิ่งสำคัญมากในการแยกแยะทั้งสองอย่าง สิ่งที่สำคัญคืออินเทอร์เฟซไม่ใช่ไฟล์interface. interfaceบอกคุณไม่มีอะไรสวยมากประโยชน์ ไม่มีอะไรที่แสดงให้เห็นถึงสิ่งนี้ได้ดีไปกว่าอินเทอร์เฟซ markerใน Java ซึ่งเป็นอินเทอร์เฟซที่ไม่มีสมาชิกเลยเพียงแค่ดูjava.io.Serializableและjava.lang.Cloneable; ทั้งสองinterfaceหมายถึงสิ่งที่แตกต่างกันมากแต่ก็มีลายเซ็นเดียวกัน
ดังนั้นถ้าสองinterfaces ว่าสิ่งที่แตกต่างกันหมายถึงมีลายเซ็นเดียวกันสิ่งที่ว่าเป็นinterfaceแม้แต่รับประกันคุณ?
อีกตัวอย่างที่ดี:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
อะไรคือสิ่งที่อินเตอร์เฟซของjava.util.List<E>.add?
- ความยาวของคอลเลกชันไม่ลดลง
- ไอเท็มทั้งหมดที่อยู่ในคอลเลกชั่นก่อนหน้านี้ยังคงอยู่ที่นั่น
- ที่
elementอยู่ในคอลเลกชัน
และสิ่งใดที่ปรากฏในช่องinterface? ไม่มี! ไม่มีสิ่งใดในสิ่งinterfaceที่บอกว่าAddต้องเพิ่มเมธอดเลย แต่ก็อาจลบองค์ประกอบออกจากคอลเล็กชันได้เช่นกัน
นี่คือการใช้งานที่ถูกต้องสมบูรณ์interface:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
อีกตัวอย่างหนึ่ง: ที่java.util.Set<E>จริงแล้วมันบอกว่ามันคือชุด ? ไม่มีที่ไหน! หรืออย่างแม่นยำมากขึ้นในเอกสาร เป็นภาษาอังกฤษ.
ในทุกกรณีinterfacesทั้งจาก Java และ. NET ข้อมูลที่เกี่ยวข้องทั้งหมดอยู่ในเอกสารจริง ๆ แล้วไม่ใช่ในประเภท ดังนั้นหากประเภทไม่ได้บอกอะไรที่น่าสนใจให้คุณเก็บไว้เลย? ทำไมไม่ยึดติดกับเอกสาร? และนั่นคือสิ่งที่ Ruby ทำ
โปรดทราบว่ามีภาษาอื่น ๆที่สามารถอธิบายอินเทอร์เฟซได้อย่างมีความหมาย แต่ภาษาเหล่านั้นมักจะไม่เรียกสร้างซึ่งอธิบายถึงการเชื่อมต่อ " interface" typeพวกเขาเรียกว่า ในภาษาการเขียนโปรแกรมที่พิมพ์ขึ้นด้วยกันตัวอย่างเช่นคุณสามารถแสดงคุณสมบัติที่sortฟังก์ชันส่งคืนคอลเลกชันที่มีความยาวเท่ากับต้นฉบับโดยทุกองค์ประกอบที่อยู่ในต้นฉบับจะอยู่ในคอลเล็กชันที่เรียงลำดับและไม่มีองค์ประกอบที่ใหญ่กว่า ปรากฏก่อนองค์ประกอบที่เล็กกว่า
ดังนั้นในระยะสั้น: ทับทิมไม่ได้เทียบเท่ากับ interfaceJava มันไม่แต่มีความเทียบเท่ากับ Java อินเตอร์เฟซและก็เหมือนกับในชวา: เอกสาร
นอกจากนี้เช่นเดียวกับใน Java สามารถใช้การทดสอบการยอมรับเพื่อระบุอินเทอร์เฟซได้เช่นกัน
โดยเฉพาะอย่างยิ่งใน Ruby นั้น อินเทอร์เฟซของออบเจ็กต์จะถูกกำหนดโดยสิ่งที่สามารถทำได้ไม่ใช่สิ่งที่classเป็นอยู่หรือสิ่งที่moduleมันผสมออบเจ็กต์ใด ๆ ที่มี<<เมธอดสามารถต่อท้ายได้ นี้จะเป็นประโยชน์อย่างมากในการทดสอบหน่วยที่คุณก็สามารถส่งผ่านในArrayหรือStringแทนที่จะเป็นความซับซ้อนมากขึ้นLoggerแม้ว่าArrayและLoggerไม่เปิดเผยชัดเจนนอกเหนือจากความจริงที่ว่าพวกเขาทั้งสองมีวิธีการที่เรียกว่าinterface<<
อีกตัวอย่างหนึ่งคือStringIOซึ่งดำเนินการเช่นเดียวกันอินเตอร์เฟซเป็นIOและทำให้ส่วนใหญ่ของอินเตอร์เฟซของFileแต่ไม่มีการแบ่งปันบรรพบุรุษร่วมกันใด ๆ Objectนอกเหนือจาก