Ruby có Giao diện giống như bất kỳ ngôn ngữ nào khác.
Lưu ý rằng bạn phải cẩn thận để không nhầm lẫn khái niệm Giao diện , đó là một đặc tả trừu tượng về trách nhiệm, bảo đảm và giao thức của một đơn vị với khái niệm interface
là từ khóa trong lập trình Java, C # và VB.NET ngôn ngữ. Trong Ruby, chúng tôi sử dụng cái trước mọi lúc, nhưng cái sau đơn giản là không tồn tại.
Nó là rất quan trọng để phân biệt hai. Điều quan trọng là Giao diện , không phải interface
. Nó interface
cho bạn biết khá nhiều điều không hữu ích. Không có gì thể hiện điều này tốt hơn các giao diện đánh dấu trong Java, đó là các giao diện không có thành viên nào cả: chỉ cần xem java.io.Serializable
và java.lang.Cloneable
; hai chữ interface
đó có nghĩa là những thứ rất khác nhau, nhưng chúng có cùng một chữ ký.
Vì vậy, nếu hai chữ interface
cái đó có nghĩa là những thứ khác nhau, có cùng một chữ ký, thì điều gì chính xác là interface
đảm bảo cho bạn?
Một ví dụ điển hình khác:
package java.util;
interface List<E> implements Collection<E>, Iterable<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException;
}
Là gì Giao diện của java.util.List<E>.add
?
- rằng độ dài của bộ sưu tập không giảm
- rằng tất cả các mục trong bộ sưu tập trước đó vẫn ở đó
- đó
element
là trong bộ sưu tập
Và cái nào trong số đó thực sự xuất hiện trong interface
? Không ai! Không có gì trong interface
đó nói rằng Add
phương thức thậm chí phải thêm chút nào, nó cũng có thể xóa một phần tử khỏi bộ sưu tập.
Đây là một triển khai hoàn toàn hợp lệ của điều đó interface
:
class MyCollection<E> implements java.util.List<E> {
void add(int index, E element)
throws UnsupportedOperationException, ClassCastException,
NullPointerException, IllegalArgumentException,
IndexOutOfBoundsException {
remove(element);
}
}
Một ví dụ khác: java.util.Set<E>
nó thực sự nói rằng nó ở đâu, bạn biết đấy, một tập hợp ? Hư không! Hay chính xác hơn là trong tài liệu. Bằng tiếng Anh.
Trong hầu hết các trường hợp interfaces
, cả từ Java và .NET, tất cả thông tin liên quan thực sự nằm trong tài liệu chứ không phải trong các loại. Vì vậy, nếu các kiểu không cho bạn biết bất cứ điều gì thú vị, tại sao lại giữ chúng? Tại sao không chỉ vào tài liệu? Và đó chính xác là những gì Ruby làm.
Lưu ý rằng có những ngôn ngữ khác mà Giao diện thực sự có thể được mô tả theo cách có ý nghĩa. Tuy nhiên, những ngôn ngữ đó thường không gọi cấu trúc mô tả Giao diện " interface
", họ gọi nó type
. Trong một ngôn ngữ lập trình được định kiểu phụ thuộc, chẳng hạn, bạn có thể diễn đạt các thuộc tính mà một sort
hàm trả về một tập hợp có cùng độ dài với tập hợp ban đầu, rằng mọi phần tử trong tập hợp ban đầu cũng nằm trong tập hợp đã sắp xếp và không có phần tử nào lớn hơn xuất hiện trước một phần tử nhỏ hơn.
Vì vậy, nói ngắn gọn: Ruby không tương đương với Java interface
. Nó không , tuy nhiên, có một tương đương với một Java Interface , và nó hoàn toàn giống như trong Java: tài liệu hướng dẫn.
Ngoài ra, giống như trong Java, Kiểm tra chấp nhận cũng có thể được sử dụng để chỉ định các Giao diện .
Đặc biệt, trong Ruby, Giao diện của một đối tượng được xác định bởi những gì nó có thể làm , chứ không phải class
là cái gì hay module
nó trộn vào. Bất kỳ đối tượng nào có <<
phương thức đều có thể được thêm vào. Điều này rất hữu ích trong các bài kiểm tra đơn vị, nơi bạn có thể chỉ cần vượt qua một Array
hoặc một String
thay vì phức tạp hơn Logger
, mặc dù Array
và Logger
không chia sẻ rõ ràng interface
ngoài thực tế là cả hai đều có một phương thức được gọi <<
.
Một ví dụ khác là StringIO
, mà cụ cùng giao diện như IO
và do đó một phần lớn của giao diện của File
, nhưng mà không chia sẻ bất kỳ tổ tiên chung bên cạnh Object
.