如果有人可以解释为什么在Smalltalk中使用该表达式
class := Class new
name: 'OurClass';
superclass: Object
不适用于创建新类。更准确地说,当诸如class
之类的对象试图充当普通类时,什么是错,什么是正确的?它可以创建实例吗?可以编译方法吗?它不能做什么?
答案 0 :(得分:2)
您没有指定正在使用的Smalltalk方言(例如,这在Squeak或Cuis中不起作用),但我将假设它是Pharo,因为它在执行时不会出错。在Pharo中,它似乎确实创造了一个使我感到惊讶的新类……在其他Squeak方言中,我认为它甚至不会远程完成您想要的操作。因此,第一个问题是它是非标准的,但这相对较小...
在本次讨论中,我们假设您的示例代码在Smalltalk方言中受支持,并且确实达到了您想要的目的:创建一个新类OurClass作为Object的子类。更大的问题是,您创建的实质上是一个与Smalltalk环境的其余部分断开连接的孤岛,因为您已经绕过了所有Smalltalk元数据/元结构。因此,您无法做像打开浏览器窗口并找到“ OurClass”那样简单的事情……Smalltalk的其余部分对此一无所知。像OurClass new
之类的东西将无法工作。您的新类也不是根目录,因此,如果您从示例中丢弃class
变量,该类将消失。这也意味着它不会成为任何包的一部分,并且您的类定义将不会与其余的源代码一起保存下来。通过这种方式做事,您可能还会遇到其他惊喜(即调试器可能会对此感到cho恼)。那么对于通用类创建需求,这有什么问题呢?几乎所有内容。
也就是说,在一个用例中,您可能合法地希望以这种方式创建类:metaprogramming。一个有效的元编程用例将是创建一个匿名类,在该类中您需要完全这种“断开连接”的行为,并且需要临时/内部使用一个类,但不希望其他人看到/使用它。 Smalltalk环境。只要您真的想要并且需要以这种方式做事,我就不会觉得有问题。几次我都需要这样的东西(从来没有完全那样做过,但是很接近)我已经确保很好地记录下来,因为这不是您6个月后可能想起的那种事情或为什么……更不用说另一个程序员了。对于元编程,如果您有特定的需求,这是适合该工作的工具,那又合适吗?几乎所有内容。