Squirrel中的类与实例

来源:互联网 发布:深圳大数据协会 编辑:程序博客网 时间:2024/05/01 11:44

<!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if gte mso 10]><![endif]-->

Squirrel作为一个开源项目,其诞生收到了著名的脚本语言LUA的影响。和LUA不同的是,Squirrel提供了一种类似面向对象语言的表达能力,同时,它在很多语言的细节处理上与C或者C++更加接近。当然,由于其本质上仍然是以表格为基础的动态类型语言,所以它的面向对象能力常常和我们所习惯的C++的面向对象有着很大的不同。首先,它的所谓的类,其实也是一个表格,而类的实例化大致相当于类表格的浅拷贝。因此,如果在类中包含了表格、数组或者其他类的实例的话,在创建类对象的时候,类对象中对应的项目和类中引用的是相同的表格、数组或实例,也就是说,虽然没有把这些成员定义为静态,但他们的行为就相当于C++中的类的静态成员。如:

 

 

class Base

{

      embeded_table=

      {       

         entry = 0;

      }

}

 

local t1 = Base();

local t2 = Base();

t1.embeded_table.entry = 1;

print(t2.embeded_table.entry);

 

上面这段代码的输出是1,因为在类中嵌入的表格,实际上是对表格对象的引用,在生成类Base的实例t1, t2时,两个实例中的embed_table引用的实际上是同一份表格。

如果希望两个实例中各有自己的表格副本,则可以使用如下代码:

class Base

{

      embeded_table= null;

      constructor()

      {

         embeded_table = {

             entry = 0;

           }

      }

}

 

local t1 = Base();

local t2 = Base();

t1.embeded_table.entry = 1;

print(t2.embeded_table.entry);

上面的代码在创建类实例的时候复制类的成员的时候表格还未创建,而在构造函数中则为当前的实例创建专属实例的表格。这个类可以算是C++中的类的一个不怎么优雅的模拟,真正可以说是生成实例的一个模板了。

原创粉丝点击