引用:
这个接口告诉我
代码
if dog instanceof IPserson {
dog.say("i am person") ;
}
恩……显然你写程序不会这样写。实际上你写的是
代码
复制内容到剪贴板
代码:
// Dog implements IPerson
dog.say("i am person") ; 因为编译器会帮你检查,如果dog没有IPerson接口,这个调用就是编译错误。
这是对的。但是可以细究下去:什么契约?实际上这个接口同时扮演着两个契约。第一,它约定了Dog类有哪些方法可以给别人使用,或者说它是一个语义契约;第二,它是一个编译契约,让编译器通过这段程序。这是两件独立的事情,只不过Java用编译器来校验语义契约,所以常常把这两件事混为一谈。
那么Ruby是没有编译过程的,所以Ruby也不需要interface这种语法构造来校验语义契约。Ruby的语义契约风格叫“duck typing”:如果它叫起来像鸭子,走起来像鸭子,那么它就是鸭子,虽然它并没有实现“鸭子”的接口。所以你的这个问题根本就是一个伪问题。按照Ruby的风格,所有的对象都有自己的“接口”(语义契约),要怎么IoC就怎么IoC好了。