Smalltalk是否有类接口的实现?

Kev*_*ger 4 smalltalk

在C#中,类可以具有可以具有多个实现的接口.你怎么用smalltalk做到这一点?

Luk*_*gli 12

首先,您通常不需要接口,因为如果一个对象实现了与另一个对象相同的消息,它就可以替换它.在Java和C#中,除非它们位于同一层次结构中,否则您无法执行此操作,因此您需要接口.

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


Kev*_*ger 5

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

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


小智 5

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

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

LoggerIterface >> log: anObject
    self shouldBeImplemented


LoggerIterface >> reset
    self shouldBeImplemented
Run Code Online (Sandbox Code Playgroud)

等等......所以,检查这个类,你现在需要实现哪些方法,以便这个对象的用户运行良好.注意这#shouldBeImplementedObject用这样的东西实现的(在Pharo Smalltalk中):

Object >> shouldBeImplemented
    "Announce that this message should be implemented"

    self error: 'This message should be implemented'
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,它只是一种惯例,它不是由语言本身强加的.

干杯

马里亚诺