Ruby与任何其他语言一样具有接口。
请注意,您必须注意不要将接口的概念混为一谈,它是一个单元的职责、保证和协议的抽象规范,interface
它是 Java、C# 和 VB.NET 编程中的关键字的概念语言。在 Ruby 中,我们一直使用前者,但后者根本不存在。
区分两者非常重要。重要的是接口,而不是interface
. interface
告诉你几乎没有什么有用的。没有什么比 Java 中的标记接口更能说明这一点了,它们是完全没有成员的接口:看看java.io.Serializable
and java.lang.Cloneable
; 这两个interface
s 意味着非常不同的东西,但它们具有完全相同的签名。
那么,如果两个interface
表示不同事物的 s 具有相同的签名,那么究竟是什么来interface
保证你呢?
另一个很好的例子:
interface ICollection<T>: IEnumerable<T>, IEnumerable
{
void Add(T item);
}
什么是接口?System.Collections.Generic.ICollection<T>.Add
- 集合的长度不会减少
- 之前收藏中的所有物品都还在那里
- 那
item
是在集合中
其中哪些实际上出现在interface
?没有任何!没有任何内容interface
表明该Add
方法甚至必须添加,它也可以从集合中删除一个元素。
这是一个完全有效的实现interface
:
class MyCollection<T>: ICollection<T>
{
void Add(T item)
{
Remove(item);
}
}
另一个例子:java.util.Set<E>
它实际上在哪里说它是一个集合?无处!或者更准确地说,在文档中。用英语。
在几乎所有的情况下interfaces
,无论是来自 Java 还是 .NET,所有相关信息实际上都在文档中,而不是在类型中。所以,如果这些类型无论如何都不能告诉你任何有趣的事情,为什么还要保留它们呢?为什么不只关注文档?而这正是 Ruby 所做的。
请注意,还有其他语言实际上可以以有意义的方式描述接口。但是,这些语言通常不调用描述接口“ interface
”的构造,而是调用它type
。例如,在依赖类型的编程语言中,您可以表达以下属性:sort
函数返回与原始集合长度相同的集合,原始集合中的每个元素也在排序集合中,并且之前没有更大的元素出现一个较小的元素。
所以,简而言之:Ruby 没有与 Java 等价的东西interface
。但是,它确实具有与 Java Interface等效的功能,并且与 Java: 文档中的完全相同。
此外,就像在 Java 中一样,验收测试也可用于指定Interface。
特别是,在 Ruby 中,对象的接口取决于它可以做什么,而不是它class
是什么,或者module
它混合了什么。任何具有<<
方法的对象都可以附加到。这在单元测试中非常有用,您可以简单地传入 an或Array
a而不是String
更复杂的.Logger
Array
Logger
interface
<<
另一个例子是StringIO
,它实现了与 的接口相同的接口IO
,因此实现了大部分接口,File
但除此之外不共享任何共同的祖先Object
。