接口实际上为拥有它们的静态语言(如Java)增加了一定程度的动态语言灵活性。它们提供了一种查询对象的方法,该对象实现了契约
运行时
这个概念很好地移植到动态语言中。当然,这取决于您对“动态”一词的定义,甚至包括Objective-C,它在Cocoa中非常广泛地使用协议。
在鲁比我可能会问
object.respond_to? :sync
所以,是的,它有一个名为“sync”的方法,不管这是什么意思。
在Objective-C中,我可能会问类似的问题,即“这个看起来/走路/嘎嘎叫像是同步的东西吗?”:
[myObject respondsToSelector:@selector(sync)]
更好的是,以一些冗长的内容为代价,我可以问一些更具体的问题,例如,“这个看起来/走路/嘎嘎叫像是与MobileMe同步的东西吗?”:
[myObject respondsToSelector:@selector(sync:withMobileMeAccount:)]
那是鸭子在物种层次上的分类。
但要问一个对象是否有希望实现与MobileMe的同步。。。
[receiver conformsToProtocol:@protocol(MobileMeSynchronization)]
当然,您可以通过检查一系列选择器的存在来实现协议,这些选择器是您考虑的协议/duck的定义,并且它们是否足够具体。在哪一点上,这个协议仅仅是一大块丑陋回应的缩写?查询和一些非常有用的语法糖供编译器/IDE使用。
对于更复杂的库或类层次结构来说,它无疑比大多数应用程序代码更有用,但我认为这个概念在任何语言中都是有用的。
另外,还有人提到了混音。RubyMixins是一种共享代码的方式——例如,它们与类的实现相关。接口/协议是关于类或对象的接口。它们实际上可以相互补充。您可能有一个指定行为的接口,以及一个或多个帮助对象
实施
当然,我想不出任何一种语言都有明显的一级语言特征。在那些有mixin的系统中,包括mixin通常意味着它实现的接口。