【问题标题】:What does "classes are not objects" mean?“类不是对象”是什么意思?
【发布时间】:2020-05-26 02:31:34
【问题描述】:

来自 GoF 书:

原型对于像 C++ 这样的静态语言特别有用,其中 类不是对象,类型信息很少或没有 在运行时可用。它在 Smalltalk 等语言中不太重要 或提供相当于原型(即类 object) 用于创建每个类的实例。这个模式是建立的 进入像 Self [US87] 这样的基于原型的语言,其中所有对象 通过克隆原型进行创建。

“类不是对象”是什么意思?

不总是这样吗?

类成为对象意味着什么?

【问题讨论】:

  • 就像蓝图不是建筑物一样。在 C++ 中,类是蓝图。基于该蓝图构建的实例是实际对象。
  • 它的意思是一个类在数据类型、能力等方面定义了可以成为实例的对象,即对象。在OOP中,对象就像一个概念的可操作示例。跨度>
  • 你可能有一个类 foo 有 1000 多个实例(对象)。
  • 我已经更新了问题。我认为一个类总是不是一个对象,但似乎我错了。我很困惑为什么会提到这样的事情。
  • 例如在Java中你可能有一个Class的实例。该实例是一个对象。作为一种类也是对象的语言,Java 并不是对 Prototype 设计模式特别有用。

标签: c++ oop design-patterns prototype


【解决方案1】:

在某些语言中,当您声明一个类时,语言运行时会在内存中创建一个对象来表示该类及其属性;然后,您可以调用该类对象上的方法来查找该类的属性或创建该类的对象,等等。

C++ 没有该特性(主要是因为 C++ 旨在最大限度地减少运行时开销);没有代表该类的对象。 (最接近的是 RTTI 的 type_info 对象,但这实际上只是一个包含有关类的一些信息的对象,而不是类本身的完整表示)

【讨论】:

  • 很好的洞察力。运行时使用什么语言(使用类而不是原型 - 我假设你的意思)在实例化之前/不实例化它之前创建一个对象(并消耗内存)来表示类?还是我误解了你的意思?
  • 问题中的引用提到了 Smalltalk、Objective C 和 Self...,而 IIRC JavaScript 也是如此。 (关于何时构造类,即按需或在程序启动时,我不知道;我不认为细节被认为特别重要,只要类对象是代码要查阅时可用)
  • Python 和 JS 就是很好的例子,您可以在执行期间通过与类对象交互来显着改变类的行为。
【解决方案2】:

“类不是对象”是什么意思?

正是它听起来的样子。 在某些语言中,类本身也是可以向其发送消息的对象。例如,为了创建一个类的实例(即一个新对象),您向该类发送 +alloc 消息(然后您通常会向生成的对象发送一个 -init 消息:

Foo *newFoo = [[Foo alloc] init];

不是一直都是这样吗?

没有。见上文。 另见Is class an object in object oriented languageAre classes objects in Objective-C?。除 Objective-C 之外的示例还包括 Smalltalk、Scheme 和 Dylan。

类成为对象意味着什么?

这意味着您可以像使用任何其他对象一样使用类。 详细信息因语言而异。在 Objective-C 中,类是对象,因为它是 Class 元类的实例。 Objective-C 对 instance methodsclass methods 进行了区分,即可以发送到类实例的消息类本身。例如,拥有一个类的共享实例和获取该共享对象的类方法是很常见的:

NSFileManager *fileManager = [NSFileManager defaultManager];

请注意,我们实际上并没有在此处分配对象,只是向类询问可能已经存在或可能不存在的共享实例(由类管理)(如果不存在,则类通常会创建它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多