跳轉到內容

BlitzMax/語言/物件

來自 Wikibooks,開放世界中的開放書籍

字串、陣列和使用者定義型別的例項都是不同型別的物件

物件是透過引用處理的。這意味著物件用來儲存其資料的實際記憶體由所有引用該物件的變數共享。

這使得物件處理起來非常高效,因為將物件分配給變數只需分配對該物件的引用,而不是整個物件。將物件傳遞給函式並從函式返回物件也很高效,因為同樣只需要複製引用。

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" )
華夏公益教科書