--Lua语言解释性语言,没有面向对象这一说
--因为程序员习惯性面向对象的写法
--在lua模拟面向对象---需要利用lua中的基本知识解决
--tablej基础
--[[
local tableA = {};
--数组操作方式操作table---C#数组
tableA[1] = "张三";
tableA[2] = "李四";
--针对数组形式的table
print(table.getn(tableA));
for k,v in ipairs(tableA) do
print(k,v);
end
--键值对方式操作table---C#字典
local tableB = {};
tableB["one"] = 1;
--针对数组形式的table,不适应与键值对形式的table
print(table.getn(tableB));
for k,v in pairs(tableB) do
print(k,v)
end
]]
--元表的基础操作
--[[
local table1 = {name = "张三",age = 18};--主表
local table2 = {sex = "男"}; --元表
--关联两个表
--table1:主表; table2:元表、子表
setmetatable(table1,table2);
--获取一个表的元表
--print(getmetatable(table1));--table1的元表的地址
--print(getmetatable(table2));--table2没有元表
--不能通过主表访问元表
--print(table1.name,table1.age,table1.sex);
--索引 __index:g给元表设置了索引之后,我们会在“表名.键名”方式访问表的字段;
-- 当通过主表进行访问字段时,先在主表中找,如果找到了,就使用,
-- 如果主表中没有找到,那么就去元表中找;
table2.__index = table2;
print(table1.name,table1.age,table1.sex);
]]
--[[
--在lua中模拟: 类的封装
local Person = {name ,age ,sex = "男"};
--类似于构造函数
--self相当于C#中的this
function Person:New( name,age,sex )
local t = {};
setmetatable(t,self);--设置元表
self.__index = self;--给元表设置索引
self.name = name;
self.age = age ;
self.sex = sex ;
return t;
end
--Person表的成员方法
function Person:SayHallo( )
print("hallo,我是"..self.name..",我今年"..self.age..",性别:"..self.sex);
end
local zhangsan = Person:New("张三",20,"男");
--zhangsan.name = "张三";
zhangsan.age = 20;
zhangsan.sex = "男";
zhangsan:SayHallo();
local lisi = Person:New();
lisi.name = "李四";
lisi.age = 20;
lisi.sex = "女";
lisi:SayHallo();
-------模拟继承
local Student = Person:New();
function Student:New( name,age,sex,major)
local t = Person:New(name,age,sex);
setmetatable(t,self);
self.__index = self;
self.major = major;
return t;
end
--模拟重写父类方法,如果不写就会调用父类中的SayHallo方法
function Student : SayHallo( )
--print("hallo,我是"..self.name..",我今年"..self.age..",性别:"..self.sex..",专业:"..self.major);
--self:SayHallo();
print(self.major)
end
local wangwu = Student:New("王五",21,"男","Unity");
wangwu:SayHallo();
]]
--[[
--类的声明,这里声明了类名还有属性,并且给出了属性的初始值
Class = {x=nil,y=0,sex = nil}
--构造方法,构造方法的名字是随便起的,习惯性命名为new()
function Class:new(x,y,sex)
--print(self)
local t = {} --初始化self,如果没有这句,那么类所建立的对象如果有一个改变,其他对象都会改变
--print(t)
setmetatable(t, Class) --将self的元表设定为Class
--设置元表的索引,想模拟类的话,这步操作很关键
Class.__index = Class
t.x = x --属性值初始化
t.y = y
t.sex = sex
return t --返回自身
end
--这里定义类的其他方法
function Class:test()
print(self.x,self.y,self.sex)
end
function Class:plus()
self.x = self.x + 1
self.y = self.y + 1
end
local c = Class:new(2)
c:test()
c:plus()
c:test()
local d = Class : new(5,8,"女")
d:test()
--table 引用数据类型
local str1 = "abc";
local str2 = "abc";
--print(str1 == str2);--true
local t = {1,2,3,4};
local t2 = {1,2,3,4};
--table是引用类型
--print(t );
--print(t2);
]]
local Person = {name="123",age = 0,sex = "男"}
function Person : New(name,age,sex )
local t = {}
setmetatable(t,Person)
self.__index = self
self.name = name
self.age = age
self.sex = sex
return t
end
function Person:Show( )
print(self.name,self.age,self.sex)
end
local zhangsan = Person:New("张三")
zhangsan:Show()
Lua面向对象实例
最新推荐文章于 2022-12-26 22:28:27 发布