当前位置: 首页 > 编程笔记 >

Lua中实现面向对象的一种漂亮解决方案

何浩荡
2023-03-14
本文向大家介绍Lua中实现面向对象的一种漂亮解决方案,包括了Lua中实现面向对象的一种漂亮解决方案的使用技巧和注意事项,需要的朋友参考一下

在 pil 中,lua 的作者推荐了一种方案来实现 OO,比较简洁,但是我依然觉得有些繁琐。

这里给出一种更漂亮一点的解决方案,见下文:

这里提供 Lua 中实现 OO 的一种方案:


local _class={}

 

function class(super)

 local class_type={}

 class_type.ctor=false

 class_type.super=super

 class_type.new=function(...) 

   local obj={}

   do

    local create

    create = function(c,...)

     if c.super then

      create(c.super,...)

     end

     if c.ctor then

      c.ctor(obj,...)

     end

    end

 

    create(class_type,...)

   end

   setmetatable(obj,{ __index=_class[class_type] })

   return obj

  end

 local vtbl={}

 _class[class_type]=vtbl

 

 setmetatable(class_type,{__newindex=

  function(t,k,v)

   vtbl[k]=v

  end

 })

 

 if super then

  setmetatable(vtbl,{__index=

   function(t,k)

    local ret=_class[super][k]

    vtbl[k]=ret

    return ret

   end

  })

 end

 

 return class_type

end

现在,我们来看看怎么使用:
base_type=class()  -- 定义一个基类 base_type

 

function base_type:ctor(x) -- 定义 base_type 的构造函数

 print("base_type ctor")

 self.x=x

end

 

function base_type:print_x() -- 定义一个成员函数 base_type:print_x

 print(self.x)

end

 

function base_type:hello() -- 定义另一个成员函数 base_type:hello

 print("hello base_type")

end


以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。
下面看看怎样继承:

test=class(base_type) -- 定义一个类 test 继承于 base_type

 

function test:ctor() -- 定义 test 的构造函数

 print("test ctor")

end

 

function test:hello() -- 重载 base_type:hello 为 test:hello

 print("hello test")

end


现在可以试一下了:

a=test.new(1) -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。

a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。

a:hello() -- 输出 hello test ,这个函数被重载了。 

在这个方案中,只定义了一个函数 class(super) ,用这个函数,我们就可以方便的在 lua 中定义类:


base_type=class()       -- 定义一个基类 base_type

function base_type:ctor(x)  -- 定义 base_type 的构造函数     print("base_type ctor")     self.x=x end

function base_type:print_x()    -- 定义一个成员函数 base_type:print_x     print(self.x) end

function base_type:hello()  -- 定义另一个成员函数 base_type:hello     print("hello base_type") end


以上是基本的 class 定义的语法,完全兼容 lua 的编程习惯。我增加了一个叫做 ctor 的词,作为构造函数的名字。

下面看看怎样继承: test=class(basetype) -- 定义一个类 test 继承于 basetype


function test:ctor()    -- 定义 test 的构造函数

    print("test ctor")

end

function test:hello()   -- 重载 base_type:hello 为 test:hello     print("hello test") end


现在可以试一下了:

a=test.new(1)   -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。

a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。

a:hello()   -- 输出 hello test ,这个函数被重载了。


其实,实现多重继承也并不复杂,这里就不再展开了。更有意义的扩展可能是增加一个 dtor :)

ps. 这里用了点小技巧,将 self 绑定到 closure 上,所以并不使用 a:hello 而是直接用 a.hello 调用成员函数。这个技巧并不非常有用,从效率角度上说,还是不用为好。

 类似资料:
  • 主要内容:面向对象特征,Lua 中面向对象,实例,实例,Lua 继承,实例,函数重写面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smalltalk C# Ruby 面向对象特征 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以

  • 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。 以下几种编程语言都支持面向对象编程: C++ Java Objective-C Smalltalk C# Ruby 面向对象特征 1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以

  • 本文向大家介绍Lua面向对象编程之类的简单实现方式,包括了Lua面向对象编程之类的简单实现方式的使用技巧和注意事项,需要的朋友参考一下 先来看一段程序: 输出结果: 对象工厂模式: 如前面代码的create函数 用表表示对象: 把对象的数据和方法都放进一张表内,虽然没有隐藏私有成员,但对于简单脚本来说可以完全接受 成员方法的定义: 成员方法的调用:

  • 本文向大家介绍Js面向对象的几种方式相关面试题,主要包含被问及Js面向对象的几种方式时的应答技巧和注意事项,需要的朋友参考一下 1.对象的字面量 var obj = {} 2.创建实例对象 var obj = new Object(); 3.构造函数模式 function fn(){} , new fn(); 4.工厂模式:用一个函数,通过传递参数返回对象。function fn(params){

  • 本文向大家介绍浅谈Lua的面向对象特性,包括了浅谈Lua的面向对象特性的使用技巧和注意事项,需要的朋友参考一下  面向对象的特性     类: 类是可扩展的模板用来创建对象,提供状态的初始值(成员变量)和行为的实现。     对象: 它是类的实例并具有分配给自己独立的内存。     继承: 它是由变量和类的函数被其他类继承的概念。     封装: 它是将数据和函数相结合的一类内的方法。数据可以在类

  • 本文向大家介绍MFC实现漂亮界面之美化按钮,包括了MFC实现漂亮界面之美化按钮的使用技巧和注意事项,需要的朋友参考一下 上次我们学习了如何美化对话框的界面,这次我们为上次的对话框添加两个按钮,一个是关闭按钮,另一个是最小化按钮,好,现在我们先看一下效果: 是不是很难看,因为我们的对话框美化了,所以我们的按钮也要美化,因为采用贴图的方式来美化,所以,我先给出这两个按钮的PNG格式的图片,该图片支持透