Squirrel中的类与实例

    技术2022-05-20  56

    <!-- [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++中的类的一个不怎么优雅的模拟,真正可以说是生成实例的一个模板了。


    最新回复(0)