前言 Lua的基础教程其实感觉都已经快接近尾声了,这次就直接把面向对象的这个部分以及一些其他的东西讲清楚,然后就结尾吧,其实大部分编程语言的内涵都是共通的,最主要的还是应用的问题。(只有实践才是检验真理的唯一标准!)
正文 推荐网站 Lua在线手册
Lua进程设计
这两个网站都是关于Lua语言的chm文档,可以参考学习,特别是第二个网站,十分的丰富。
面向对象 这里的“对象”不是那个“对象”,学过C++或者Java这种面向对象语言的人肯定知道,Lua也是面向对象的,其实之前就说过Lua中其实都是对象。
四大特征 封装 指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
继承 继承的方法允许在不改动原进程的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
多态 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
抽象 抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
如何使用 对象包括两个内容:属性+方法。 前者使用Lua中的table表示,后者使用function表示。(继承可以通过metetable来模拟,事实上,模拟基本的对象大多时候都已经足够使用了)
另外,由于Lua中所有都是对象,是以,table其实也是对象,也有状态(成员变量以及成员函数) 。
实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 --这里直接定义一个表table,其中包含了它的成员变量num test={num=0} --下面直接定义test对应的成员函数 function test.addNum(count) test.num=test.num+count end print("第一个:"..test.num) test.addNum(10) print("第二个:"..test.num)
结果:
创建对象 这个过程其实就是为类的实例分配内存。
1 2 --如果该类需要传入初始参数就通过小括号内传入 test1=test:new();
访问属性 直接使用. 来访问。
访问成员函数
完整实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -- Meta class Shape = {area = 0} -- 基础类方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基础类方法 printArea function Shape:printArea () print("面积为 ",self.area) end -- 创建对象 myshape = Shape:new(nil,10) myshape:printArea()
输出:
继承 继承的含义是——一个对象直接使用另外一个对象的属性方法之类。 一般的作用就是扩展基类的属性与方法。使用场景举例:Person类下面或许就可以被继承一个Student类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 -- Meta class Shape = {area = 0} -- 基础类方法 new function Shape:new (o,side) o = o or {} setmetatable(o, self) self.__index = self side = side or 0 self.area = side*side; return o end -- 基础类方法 printArea function Shape:printArea () print("面积为 ",self.area) end -- 创建对象 myshape = Shape:new(nil,10) myshape:printArea() Square = Shape:new() -- 派生类方法 new function Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return o end -- 派生类方法 printArea function Square:printArea () print("正方形面积为 ",self.area) end -- 创建对象 mysquare = Square:new(nil,10) mysquare:printArea() Rectangle = Shape:new() -- 派生类方法 new function Rectangle:new (o,length,breadth) o = o or Shape:new(o) setmetatable(o, self) self.__index = self self.area = length * breadth return o end -- 派生类方法 printArea function Rectangle:printArea () print("矩形面积为 ",self.area) end -- 创建对象 myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
输出结果:
1 2 3 面积为 100 正方形面积为 100 矩形面积为 200
重写 Lua中支持直接重写基础类的函数,在派生类中定义自己的实现方式。
实例其实就是上面一个例子中的。
数据库 Lua支持的数据库:LuaSQL ,支持的类型包括ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。
LuaSQL可使用LuaRocks 来安装需要的数据库驱动。
WIndows安装LuaRocks的方法教程
简单实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 require "luasql.mysql" --创建环境对象 env = luasql.mysql() --连接数据库 conn = env:connect("数据库名","用户名","密码","IP地址",端口) --设置数据库的编码格式 conn:execute"SET NAMES UTF8" --执行数据库操作 cur = conn:execute("select * from role") row = cur:fetch({},"a") --文档对象的创建 file = io.open("role.txt","w+"); while row do var = string.format("%d %sn", row.id, row.name) print(var) file:write(var) row = cur:fetch(row,"a") end file:close() --关闭文档对象 conn:close() --关闭数据库连接 env:close() --关闭数据库环境