|
17
|
| Srinivas Reddy Thatiparthy · 技术社区 · 16 年前 |
|
|
1
23
这个
但是,接口一直是面向对象范例的关键部分,它基本上代表了对象必须响应的方法。Java只是强制这种机制来提供静态类型检查。 做 使用接口,即使他们不静态检查它们。就像其他数据类型一样,例如在Ruby中:
你不必申报
另一方面 Structural type
|
|
|
2
5
我们没有 他们,但我们有 他们。退房 Zope Interfaces |
|
|
3
1
静态类型语言中使用接口来描述两个原本独立的对象“实现相同的行为”。在动态类型语言中,我们隐式地假设当两个对象有一个具有相同名称/参数的方法时,它执行相同的操作,因此接口没有任何用处。 |
|
|
4
1
值得注意的是,与许多人第一次响应时所说的相反,接口可以用来做的不仅仅是记录“类支持什么方法”。格泽尼奥用“实施同样的行为”的措词触及了这一点。作为一个具体的例子,看看Java接口Serializable。它没有实现任何方法;相反,它被用作一个“标记”来指示类可以安全地序列化。
|
|
|
5
1
至少有些动态语言使显式接口有点尴尬,其中一个关键点是,动态语言通常可以响应事先不知道的消息(呃,方法调用),甚至可以动态创建方法。要知道对象是否会正确响应消息,唯一真正的方法是向它发送消息。这没关系,因为动态语言认为支持这类东西比静态类型检查更好;对象被认为在特定协议中可用,因为已知其能够参与该协议(例如,通过另一消息给出)。 |
|
|
6
1
也就是说,接口作为 概念 在动态世界中仍然非常重要,但它们通常只是在文档中定义,而不是由语言强制执行。偶尔,我也会看到程序员实际制作了一个基类来勾勒出这个接口;这有助于文档的形式化,如果接口的一部分可以用接口的其余部分来实现,那么它就特别有用。 |
|
|
7
1
Perl有角色(或特性),它不仅仅是接口不同于javaperl角色我们可以有一个实现查看这些链接了解更多关于Perl角色的信息 |
|
|
8
0
Python支持 multiple inheritance |
|
|
9
0
http://en.wikipedia.org/wiki/Duck_typing 换句话说,如果您执行一个对象来支持Delete()方法,那么您可以只使用
方法,但如果对象不支持Delete(),则会出现运行时错误。静态类型语言不允许这样做,并抛出编译时错误。因此,您基本上是以类型安全性来换取更快的开发时间和灵活性。 如果没有接口,您可以在静态语言中执行类似操作:
但这需要传递给此方法的每个对象都从MyBaseClass继承。因为Java或C不支持多重继承,这不是很灵活,因为如果你的类已经继承了另一个类,它也不能从MyBaseClass继承。因此,更好的选择是创建一个ISavable接口,并接受它作为输入参数,以确保可以保存该项。那么你就拥有了两者中最好的:类型安全性和灵活性。
最后一个后门是使用object作为参数,如果您不能期望使用save方法实现接口的每个项。
|