代码之家  ›  专栏  ›  技术社区  ›  Leandro Caniglia Charlie

类实例有什么问题?

  •  3
  • Leandro Caniglia Charlie  · 技术社区  · 7 年前

    如果有人能解释一下为什么用Smalltalk

    class := Class new
      name: 'OurClass';
      superclass: Object
    

    不适合创建新类。更准确地说, 什么是错什么是对的 class 试图扮演一个普通的班级?它能创建实例吗?它能编译方法吗?它不能做什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   blihp    7 年前

    您没有指定要使用哪种Smalltalk方言(例如,这在Squeak或CUI中不起作用),但我将假设它是Pharo,因为它在那里执行时没有错误。在Pharo中,它实际上似乎创建了一个新的类,这让我吃惊。。。在其他吱吱叫的方言中,我认为它甚至不会做你想做的事。所以第一个问题是它是不标准的,但那是相对较小的。。。

    在本次讨论中,假设您的示例代码在Smalltalk方言中受支持,并完全按照您的要求执行:创建一个新类OurClass作为对象的子类。更大的问题是,您所创建的实际上是一个与Smalltalk环境的其余部分断开连接的孤岛,因为您已经绕过了所有Smalltalk元数据/元结构。所以你不能做一些简单的事情,比如打开一个浏览器窗口,找到“我们的类”。。。其他的Smalltalk都不知道。像这样的事情 OurClass new class 变量从您的示例中,类将消失。这也意味着它不会成为任何包的一部分,并且类定义不会与其他源代码一起保存。这样做可能会让您遇到其他意外(例如,调试器可能会阻塞它等),因此对于通用类创建需求,它有什么问题?几乎所有的事情。

    metaprogramming . 一个有效的元编程用例是创建一个匿名类,在这个匿名类中,您需要这种“断开连接”的行为,并且临时/内部需要一个类,但不希望它被其他Smalltalk环境看到/使用。只要你真的想这样做,我觉得没问题。有几次我需要这样的东西(从来没有这样做过,但很接近),我肯定会把它记录得很好,因为这不是那种你6个月后可能会记得你在做什么或为什么。。。更不用说另一个程序员了。对于你有特殊需求的元编程来说,这是一个合适的工具,有什么用呢?几乎所有的事情。