在C#类中可以有可以有多个实现的接口。你是如何在smalltalk中做到的?
答案 0 :(得分:12)
首先,您通常不需要接口,因为如果对象实现与另一个对象相同的消息,则可以替换它。在Java和C#中,除非它们在同一层次结构中,否则不能这样做,因此您需要接口。
答案 1 :(得分:5)
今天与我的同事讨论后,在我看来答案是任何类都可以被视为一个接口,因为任何类都可以通过消息传递给任何其他类。
smalltalk中的任意数量的类都可以响应同一条消息,因此根据C#和java,您不需要接口。
答案 2 :(得分:5)
正如卢卡斯所说,大多数时候,你不需要它们。主要是因为实现多态性,您唯一需要的是实现相同的消息。无需为它们定义通用类型。
另一方面,有时候,从MY的角度来看,你确实需要接口。主要是当你有合同要展示,或者有一种抽象的超类时。这在开发框架时非常常见。以记录器或序列化器为例。在这种情况下,您可能希望定义序列化程序应实现的强制方法。然后,您可以创建一个抽象超类,所有方法都以这种方式实现:
LoggerIterface >> log: anObject
self shouldBeImplemented
LoggerIterface >> reset
self shouldBeImplemented
等等......所以,检查这个类,你现在需要实现哪些方法,以便这个对象的用户运行良好。
请注意,#shouldBeImplemented
在Object
中实现了类似的内容(在Pharo Smalltalk中):
Object >> shouldBeImplemented
"Announce that this message should be implemented"
self error: 'This message should be implemented'
但正如你所看到的,它只是一种惯例,它不是由语言本身强加的。
干杯
马里亚诺
答案 3 :(得分:4)
即使没有被称为“接口”,Dolphin Smalltalk(http://www.object-arts.com/)也提供了一个名为“Protocols”的功能,它是一流的对象。
每个协议定义一组选择器(方法名称),您可以测试一个类是否符合某个协议:
conformsToProtocol: protocol
"Answer whether the receiver conforms to the named <MethodProtocol>."
您最终拥有一组正式/已定义的方法名称,您可以检查某个对象是否可以在协议的上下文中使用。 此外,类浏览器将显示所选类符合的协议列表。
还有一个协议浏览器,因此您可以浏览每个协议并查看系统范围内哪些类符合它们。
总结:Smalltalk中不需要接口,至少不实现多态。然而,某些Smalltalk方言对协议提供不同程度的支持,这些协议是接口的模拟,但适用于动态语言。