跳到主要内容
版本:master

component

1. 概述

本文档是GS语言中component机制的教程,主要介绍了组件化编程的核心概念、语法规则和实际应用方法。

文档面向已经掌握GS语言基础语法的开发者,特别是那些希望提高代码复用性、实现模块化设计的读者。

通过阅读本文档,您将能够掌握组件声明、引入和使用的完整语法、理解GS语言中组件的核心概念和工作原理、学会使用虚函数实现多态行为、了解组件路径引用的规则和最佳实践、具备在实际项目中应用组件化编程的能力。

2. component 概念

component组件是一种用于扩展主类功能的机制,允许将一个类(组件类)作为另一个类(主类)的补充。通过组件,主类可以复用组件类中定义的公共和保护函数,并支持虚函数的覆写和基类函数调用

在 GS 语言中component组件与import导入是两种不同的机制,其核心的区别如下:

特 性componentimport
核心关系组合(Has-a):将另一个模块作为功能模块嵌入到当前类中。引用(Use):引入一个模块的命名空间,以便调用其内部的函数或访问其对象。
访问方式主类可以直接访问组件类的 publicprotected 成员,如同访问自己的成员一样。只能通过模块名(即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中以publicprotected权限声明的函数。且不需要像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 虚函数与重载

虚函数是组件中可以被覆写的函数。虚函数可以是 publicprotected 的。覆写时必须使用相同的访问修饰符(即 public 虚函数必须用 public 覆写,protected 虚函数必须用 protected 覆写)。

  • 虚函数及重载函数声明:虚函数或重载函数在声明时需要在访问限定符如publicprotected后,函数的返回类型之前添加virtualoverride限定符。
  • 重载函数中基类函数调用:若要在重载函数中调用基类的函数请以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语言中实现代码文件包含的相应内容。