欢迎来到 Smalltalk!Smalltalk 的一大优点是它信任开发人员,他们从这种信任带来的力量中受益。所以像“不能”和“非法”这样的词很少适用。
与大多数其他事物一样,Smalltalk 中的抽象类更像是一个建议/指针,而不是严格的法律。您寻找的两条线索是#subclassResponsibility 和#shouldNotImplement。这两种方法是子类是否包含特定方法的线索。检查发件人以获取图像中的示例(始终是问题的一个很好的起点)。
由于如上所述,“抽象”实际上是基于每个方法的,因此您的示例不会产生错误(除非从初始化调用 #subclassResponsibility 或 #shouldNotImplement。
两件小事:
- 类名在 Smalltalk 中大写,所以是 Abst,而不是 abst。
- 谷歌搜索有很长的路要走。“smalltalk abstract class”的四个顶级链接中的三个就是您所需要的(尤其是这个看起来正确)。
更新:如果你想向你的类的用户发出信号,他们不应该创建实例(就像你在下面的评论中一样),你可以写:
Abstract>>new
^ self subclassResponsibility.
然后“Abstract new”-> 错误,但是“AbstractSubclass new”没问题。
尽管仍然不能保证 AbstractSubclass 已经覆盖了抽象方法(不是#new,而是导致您首先想要阻止实例化的方法),但实际上这不会成为问题。如果你真的想要,你可以检查一下,也许在#initialize 中,以确保没有实例的方法调用#subclassResponsibility,但除非你有充分的理由,否则不要打扰。
更新 2:您制作类抽象的实用方法是:
Class>>makeAbstract
self class compile: 'new
^ self subclassResponsibility'.