component
1. 概述
本文档是GS语言中component机制的教程,主要介绍了组件化编程的核心概念、语法规则和实际应用方法。
文档面向已经掌握GS语言基础语法的开发者,特别是那些希望提高代码复用性、实现模块化设计的读者。
通过阅读本文档,您将能够掌握组件声明、引入和使用的完整语法、理解GS语言中组件的核心概念和工作原理、学会使用虚函数实现多态行为、了解组件路径引用的规则和最佳实践、 具备在实际项目中应用组件化编程的能力。
2. component 概念
component组件是一种用于扩展主类功能的机制,允许将一个类(组件类)作为另一个类(主类)的补充。通过组件,主类可以复用组件类中定义的公共和保护函数,并支持虚函数的覆写和基类函数调用。
在 GS 语言中component组件与import导入是两种不同的机制,其核心的区别如下:
| 特 性 | component | import |
|---|---|---|
| 核心关系 | 组合(Has-a):将另一个模块作为功能模块嵌入到当前类中。 | 引用(Use):引入一个模块的命名空间,以便调用其内部的函数或访问其对象。 |
| 访问方式 | 主类可以直接访问组件类的 public 和 protected 成员,如同访问自己的成员一样。 | 只能通过模块名(即import_name)来访问其 public 成员(如 import_name.function_name()) |
| 实例创建 | 只会为当前类创建object实例。 | 为当前脚本与调用了函数的导入的脚本创建object实例。 |
| 生命周期 | 组件的生命周期与主类绑定。(实际都在同一个object实例中) | 模块是静态的,通常通过 load_static加载,生命周期由运行时管理,通常与导入者无关。 |
| 关键能力 | 支持虚函数(virtual) 和重写(override),实现多态。主类可以重写组件的方法,并通过 base关键字调用其原始实现。 | 不支持重写。只能调用模块提供的固定接口。 |
| 本质 | 是一个语言特性,用于在类之间建立紧密的组件关系。 | 是一个语法糖,其本质是一个字符串路径,最终被编译为类似 "/path/to/module.gs".function_name()的形式。 |
3. component 基础
3.1 component 声明
component的语法规则如下,除了关键字被替换外其他的语法规则基本与import相同:
component component_name;
- 导入指定组件,组件名对应文件路径(省略
.gs后缀) - 导入后可通过
function_name()调用组件中的函数 - component_name 既可以是字符串字面量形式的路径也可以是以
.分割的路径名表示的路径(可以省略脚本文件的 .gs 后缀)
componet 的基础使用示例如下(注意为双文件示例,需手动拆分):
// foo.gs
public void public_hello()
{
writeln("Hello component public");
}
protected void protected_hello()
{
writeln("Hello component protected");
}
private void private_hello()
{
writeln("Hello component private");
}
// test.gs
component .foo;
public_hello(); // 成功,允许调用组件中的 public 声明函数
protected_hello(); // 成功,允许调用组件中的 protected 声明函数
// private_hello(); // 失败,禁止调用组件中的 private 声明函数
示例3-1:component 基础实例
实例的输出如下:
Hello component public
Hello component protected
可以看到在component .foo;导入foo.gs组件后我们可以在test.gs脚本中直接调用foo.gs中以public或protected权限声明的函数。且不需要像import那样以import_name作为调用的前缀。
同时如果我们此时在shell中敲入'object.get_all()以获取所有的object实例,会发现只有test.gs的实例存在而不像import那样存在foo.gs的实例。此时foo.gs已经是test.gs的组件。
3.2 component 路径
component的路径规则与import的路径规则完全相同,这里不再赘述。请查阅 import 文档
3.4 component 虚函数与重载
虚函数是组件中可以被覆写的函数。虚函数可以是 public 或 protected 的。覆写时必须使用相同的访问修饰符(即 public 虚函数必须用 public 覆写,protected 虚函数必须用 protected 覆写)。
- 虚函数及重载函数声明:虚函数或重载函数在声明时需要在访问限定符如
public或protected后,函数的返回类型之前添加virtual或override限定符。 - 重载函数中基类函数调用:若要在重载函数中调用基类的函数请以
base.开头进行相应函数的调用。
一个简单的虚函数及重载函数示例如下:
//bar.gs
public virtual void foo_bar()
{
write ("bar\n");
}
//test.gs
component .bar;
public string foo()
{
return "Hello ";
}
public override void bar.foo_bar()
{
write(foo());
base.foo_bar(); // 调用 bar.gs中的实现
}
foo_bar(); // 输出 Hello World
示例3-2:虚函数及重载函数的简单示例
示例的输出如下:
Hello bar
3.5 component路径
component的路径规则和import完全一致.
3. 拓展阅读
更多component相关的内容或实现细节请参照手册文档:
4. 总结
本教程详细介绍了GS语言中component机制的核心概念和使用方法。通过学习,我们了解到:
主要内容回顾:
- 组件概念:理解了组件是一种组合(Has-a)关系,与import的引用(Use)关系有本质区别。
- 基础语法:掌握了component的声明方式和基本使用规则。
- 访问控制:学会了组件中public、protected、private成员的不同访问权限。
- 虚函数机制:了解了虚函数的声明、覆写以及通过base关键字调用基类实现的方法。
- 路径规则:明确了component路径引用与import保持一致的规则。
下一步学习: 掌握了component机制后,我们继续 include 章节的机制学习,了解如何在GS语言中实现代码文件包含的相应内容。