Lua面向对象实例

--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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Lua 中,可以使用“似有字段”(Pseudo-Fields)来模拟面向对象编程中的成员变量。所谓“似有字段”,指的是在表中使用函数来表示一个字段,使得它看起来像一个变量,但实际上是一个函数调用。下面是一个使用“似有字段”实现面向对象的示例: ```lua -- 定义一个类 local MyClass = {} -- 定义一个似有字段 name MyClass.name = function(self, value) if value then self._name = value else return self._name end end -- 定义一个方法 function MyClass:hello() print("Hello, my name is " .. self:name() .. "!") end -- 创建一个实例 local obj = {} setmetatable(obj, { __index = MyClass }) -- 使用 name 字段 obj:name("Jack") print(obj:name()) -- 输出 "Jack" -- 调用方法 obj:hello() -- 输出 "Hello, my name is Jack!" ``` 在上面的示例中,我们定义了一个类 `MyClass`,并在其中使用了一个似有字段 `name`。这个似有字段实际上是一个函数,可以用来设置和获取对象的名称。 然后,我们在类中定义了一个方法 `hello`,用来输出对象的名称。在方法中,我们调用了 `self:name()` 来获取对象的名称,实际上是调用了 `MyClass.name(self)` 函数来获取值。 最后,我们创建了一个实例 `obj`,并使用 `obj:name()` 来设置和获取对象的名称,以及调用 `obj:hello()` 方法来输出对象的名称。 通过使用“似有字段”,我们可以模拟面向对象编程中的成员变量,并在方法中使用它们。需要注意的是,在 Lua 中没有真正的私有变量,所以使用“似有字段”时需要注意保护对象的数据,以避免被外部直接修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LilyCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值