BlitzMax/语言/对象
字符串、数组和用户定义类型的实例都是不同类型的对象。
对象是通过引用处理的。这意味着对象用来存储其数据的实际内存由所有引用该对象的变量共享。
这使得对象处理起来非常高效,因为将对象分配给变量只需分配对该对象的引用,而不是整个对象。将对象传递给函数并从函数返回对象也很高效,因为同样只需要复制引用。
BlitzMax 使用一种称为引用计数的技术来跟踪程序中正在使用的对象。
引用计数背后的基本思想是每个对象都包含一个计数器,反映了引用该对象的变量的数量。当对象的计数器达到 0 时,该对象不再使用,其内存可以返回给系统。
将未使用对象返回给系统的过程称为“垃圾回收”,默认情况下,它是自动执行的。但是,可能需要“强制”进行垃圾回收(例如,检查内存泄漏),这可以通过使用GCCollect命令来完成。
对象也可以有方法——与对象关联的类似函数的操作。所有对象,包括字符串和数组,至少提供以下方法
方法 | 描述 |
ToString:String() | 将对象转换为字符串表示形式。 |
Compare:Int( withObject:Object ) | 如果一个对象小于另一个对象,则返回小于 0 的值;如果一个对象大于另一个对象,则返回大于 0 的值;如果一个对象等于另一个对象,则返回值 0。 |
SendMessage:Object( message:Object,context:Object ) | 用于向对象发送通用消息。 |
ToString 方法的默认实现将对象的地址转换为十六进制,并将此值作为字符串返回。字符串对象覆盖此行为,以返回对象本身。
Compare 方法的默认实现减去对象地址。字符串对象覆盖此行为以返回逐字符比较的结果。
SendMessage 方法提供了一个简单的通用消息系统,所有对象都可以使用。SendMessage 的默认实现只返回 null。
请注意,内置的等于和不等于运算符实际上不使用比较方法(只有一个例外)。相反,这些运算符比较内存地址,允许您确定 2 个对象引用是否实际引用同一个对象。此规则的例外是,当对字符串执行比较时,会执行逐字符比较。
可以将 Compare 方法覆盖为更适合用户定义类型的其他方法。例如,Compare 方法由列表的 Sort 方法自动使用。覆盖 Compare 方法时,应采取以下预防措施——如果要比较的第二个对象不是此方法识别的对象类型,则应返回 Super(父类型)的比较方法,而不是 0 或其他虚拟值。以下是一个示例,适用于“TScore”类型
Type TScore Field value:Int Method Compare:Int(other:Object) Local o2:TScore = TScore(other) 'if other is not a TScore, call the super compare method as fail-safe If o2 = Null Then Return Super.Compare(other) If o2.value > value Then Return -1 If o2.value < value Then Return 1 Return 0 End Method End Type
要访问对象的方法,请使用成员访问运算符。例如
Print "Hello".Compare( "Goodbye" )