Smalltalk是否有类接口的实现?

时间:2011-03-04 02:41:39

标签: smalltalk

在C#类中可以有可以有多个实现的接口。你是如何在smalltalk中做到的?

4 个答案:

答案 0 :(得分:12)

首先,您通常不需要接口,因为如果对象实现与另一个对象相同的消息,则可以替换它。在Java和C#中,除非它们在同一层次结构中,否则不能这样做,因此您需要接口。

  • 在(所有)Smalltalk中,存在协议(方法类别),其用于将方法非正式地分组在一起。
  • Pharo Smalltalk中有特征。起初它们看起来像接口,但它们也能够提供实现。

答案 1 :(得分:5)

今天与我的同事讨论后,在我看来答案是任何类都可以被视为一个接口,因为任何类都可以通过消息传递给任何其他类。

smalltalk中的任意数量的类都可以响应同一条消息,因此根据C#和java,您不需要接口。

答案 2 :(得分:5)

正如卢卡斯所说,大多数时候,你不需要它们。主要是因为实现多态性,您唯一需要的是实现相同的消息。无需为它们定义通用类型。

另一方面,有时候,从MY的角度来看,你确实需要接口。主要是当你有合同要展示,或者有一种抽象的超类时。这在开发框架时非常常见。以记录器或序列化器为例。在这种情况下,您可能希望定义序列化程序应实现的强制方法。然后,您可以创建一个抽象超类,所有方法都以这种方式实现:

LoggerIterface >> log: anObject
    self shouldBeImplemented


LoggerIterface >> reset
    self shouldBeImplemented

等等......所以,检查这个类,你现在需要实现哪些方法,以便这个对象的用户运行良好。 请注意,#shouldBeImplementedObject中实现了类似的内容(在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方言对协议提供不同程度的支持,这些协​​议是接口的模拟,但适用于动态语言。