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

Sta*_*123 7 c++ oop design-patterns prototype

来自 GoF 的书:

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

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

不总是这样吗?

一个类是一个对象是什么意思?

Jer*_*ner 8

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

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

  • Python 和 JS 就是很好的例子,通过与类对象交互,您可以在执行过程中显着改变类的行为。 (3认同)

Cal*_*leb 2

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

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

Foo *newFoo = [[Foo alloc] init];
Run Code Online (Sandbox Code Playgroud)

情况不总是如此吗?

不,见上文。另请参阅面向对象语言中的类是否是对象和Objective-C 中的类是对象吗?。除 Objective-C 之外的示例还包括 Smalltalk、Scheme 和 Dylan。

类作为对象意味着什么?

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

NSFileManager *fileManager = [NSFileManager defaultManager];
Run Code Online (Sandbox Code Playgroud)

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