Ruby มีอินเทอร์เฟซเหมือนกับภาษาอื่น ๆ
โปรดทราบว่าคุณต้องระวังไม่ให้คอนเซ็ปต์ของอินเทอร์เฟซซึ่งเป็นข้อกำหนดนามธรรมของความรับผิดชอบการค้ำประกันและโปรโตคอลของหน่วยที่มีแนวคิดinterface
ซึ่งเป็นคีย์เวิร์ดในการเขียนโปรแกรม Java, C # และ VB.NET ภาษา ใน Ruby เราใช้อดีตตลอดเวลา แต่อย่างหลังไม่มีอยู่จริง
เป็นสิ่งสำคัญมากในการแยกแยะทั้งสองอย่าง สิ่งที่สำคัญคืออินเทอร์เฟซไม่ใช่ไฟล์interface
. interface
บอกคุณไม่มีอะไรสวยมากประโยชน์ ไม่มีอะไรที่แสดงให้เห็นถึงสิ่งนี้ได้ดีไปกว่าอินเทอร์เฟซ markerใน Java ซึ่งเป็นอินเทอร์เฟซที่ไม่มีสมาชิกเลยเพียงแค่ดูjava.io.Serializable
และjava.lang.Cloneable
; ทั้งสองinterface
หมายถึงสิ่งที่แตกต่างกันมากแต่ก็มีลายเซ็นเดียวกัน
ดังนั้นถ้าสองinterface
s ว่าสิ่งที่แตกต่างกันหมายถึงมีลายเซ็นเดียวกันสิ่งที่ว่าเป็น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
ฟังก์ชันส่งคืนคอลเลกชันที่มีความยาวเท่ากับต้นฉบับโดยทุกองค์ประกอบที่อยู่ในต้นฉบับจะอยู่ในคอลเล็กชันที่เรียงลำดับและไม่มีองค์ประกอบที่ใหญ่กว่า ปรากฏก่อนองค์ประกอบที่เล็กกว่า
ดังนั้นในระยะสั้น: ทับทิมไม่ได้เทียบเท่ากับ interface
Java มันไม่แต่มีความเทียบเท่ากับ Java อินเตอร์เฟซและก็เหมือนกับในชวา: เอกสาร
นอกจากนี้เช่นเดียวกับใน Java สามารถใช้การทดสอบการยอมรับเพื่อระบุอินเทอร์เฟซได้เช่นกัน
โดยเฉพาะอย่างยิ่งใน Ruby นั้น อินเทอร์เฟซของออบเจ็กต์จะถูกกำหนดโดยสิ่งที่สามารถทำได้ไม่ใช่สิ่งที่class
เป็นอยู่หรือสิ่งที่module
มันผสมออบเจ็กต์ใด ๆ ที่มี<<
เมธอดสามารถต่อท้ายได้ นี้จะเป็นประโยชน์อย่างมากในการทดสอบหน่วยที่คุณก็สามารถส่งผ่านในArray
หรือString
แทนที่จะเป็นความซับซ้อนมากขึ้นLogger
แม้ว่าArray
และLogger
ไม่เปิดเผยชัดเจนนอกเหนือจากความจริงที่ว่าพวกเขาทั้งสองมีวิธีการที่เรียกว่าinterface
<<
อีกตัวอย่างหนึ่งคือStringIO
ซึ่งดำเนินการเช่นเดียวกันอินเตอร์เฟซเป็นIO
และทำให้ส่วนใหญ่ของอินเตอร์เฟซของFile
แต่ไม่มีการแบ่งปันบรรพบุรุษร่วมกันใด ๆ Object
นอกเหนือจาก