对象(object)
1. 概述
本章将系统介绍 GS 语言中的核心概念——对象(Object)。我们将学习并了解对象的本质、创建方式、生命周期管理以及其与原型(Program)的关系。内容包括如何使用 load_static和 new_object来加载和创建对象,理解对象的初始化过程(::entry和 create())和销毁过程(destruct),并掌握一系列用于操作和查询对象的外部函数。
本章面向已经了解 GS 基本语法,并开始接触面向对象部分的同学或需要回顾对象相关内容的同学。
通过阅读本章,您将能够理解 GS 中对象的定义及其与原型(Program)的区别和联系。掌握创建对象的两种主要方式:加载静态原型 (load_static) 和实例化新对象 (new_object)。了解对象的完整生命周期,包括初始化函数(create)和析构函数(destruct)的调用时机。GS 独特的对象管理机制,即对象必须手动销毁的重要性,以避免内存泄漏。尝试使用常用的对象操作函数来查询信息、管理状态和进行日常开发。
2. object 基础
2.1 object 概念
在GS中,对象(object)是一个包含成员变量和方法的模块。在编写.gs文件时,实际上就是在描述一个对象的原型。对象可以从文件中加载(使用load_static加载原型),也可以通过原型创建新的对象副本(使用new_object)。
与其他面向对象语言不同的是,GS对象的变量无法从外部直接访问,开发者需要在对象中提供接口函数,其他程序通过调用这些函数来操作对象。
特别注意事项:
- GS对象被设计用于表达较大规模、拥有较长生命周期的数据和方法集合
- 由于GC不会频繁检测对象,创建后的对象必须手动调用
destruct_object方法进行回收 - 若不释放对象可能导致内存浪费,严重时可能引发内存耗尽崩溃
- 如果不需要手动释放的对象,或考虑更轻量化的模块结构,可以 考虑使用 map 或新版本 GS 的 class_map
2.2 object 创建
2.2.1 object 静态加载
使用load_static可以从文件中加载 object 的原型。使用import import_name;并通过import_name.func_name();调用函数,相应的 object 会在函数调用时静态加载进来。
示例如下(注意多文件实例,需要拆分):
// example.gs
public void hello_world()
{
writeln("Hello world.");
}
// test.gs
import .example;
writeln("Try find example object : ", find_object(example));
example.hello_world(); // 这个操作也将会尝试 load_static example
writeln("Try find example object after function call: ", find_object(example));
object origin_obj_1 = load_static(example, this_domain());
object origin_obj_2 = load_static("./example.gs", this_domain());
writeln("Get static object from string: ", origin_obj_1);
writeln("Get static object from import_name: ", origin_obj_2);
示例2-1:object 创建示例
输出结果如下:
Try find example object : nil
Hello world.
Try find example object after function call: object[2881105:v0]/example.gs<Static>
Get static object from string: object[2881105:v0]/example.gs<Static>
Get static object from import_name: object[2881105:v0]/example.gs<Static>
可以看到example.hello_world()函数调用后example.gs的object被静态加载进来,相应对象实例带有<Static>后缀。此时调用load_static函数,由于example.gs的object已被静态加载,load_static直接返回了已被静态加载的对象实例,即example和"./example.gs"指向相同文件时,origin_obj_1与origin_obj_2是同一个object。总结如下。
- 当参数对应的静态对象实例不存在时
load_static会编译或查找object对象的program原型,并从program原型创建静态object对象实例。 - 当参数对应的静态对象实例存在时
load_static会直接返回该静态对象实例。 import_name.function_name_call()对静态对象的处理与load_static相同。