Lua 面向对象

2021-01-04 15:29发布

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。

LUA中最基本的结构是table,所以需要用table来描述对象的属性。
lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。


简例:

-- Czhenya Lua 面向对象


-- 对于一个对象来说, 属性 方法


--[[ 两种定义函数的方式

person.eat = function()

print(person.name.."在写LUA")

end


function person.eat()

print(person.name.."在写LUA")

end

--]]



--作为原型

Person = {name = 'Czhena',age = 22}


function Person:eat()

print(self.name.."的年龄是"..self.age)

end


function Person:new(o)    -- 若o是空的则返回false


local t = o or {}


--[[ 和下面设置结果一样,只是两种不同的方式

setmetatable{t,self}

self.__index=self

--]]


setmetatable(t,{__index = self}) --设置元表

--调用一个属性的时候,如果t中不存在,就会在__index所指的table中查找

return t

end


-- 类似于通过构造函数创建对象

person1 = Person:new({weight = 100})


person2 = Person:new()


print(person1.name)

print(person1.weight)

print(person2.name)


person1.name = "CZY"   --不会改变元表,添加到person.name

person1:eat()

person2:eat()



--继承


Student = Person:new()

Student.grade = 1


stu1 = Student:new()

stu1:eat()

print(stu1.grade)


冒号和点定义函数的区别:

-- 使用冒号和点来的定义函数,建议用什么定义函数,用什么调用


person = {name="Czhenya",age=22}


function person:eat()

print(self.name.."的年龄是"..self.age)

end


person.eat(person)


a = person


--冒号调用self自动赋值

a:eat()


--通过点来调用的时候,self不会自动赋值,必须通过参数传递

a.eat(a)


模拟实现继承:

A={}

function A:New() --A表 --> 模拟基类

    local t={}

    setmetatable(t,self)

    self.__index=self

    t.base=self

    return t

end


function A:func()

    print(self,'这是基类A表的Func函数')

end



B=A:New() --B表 --> 一级派生类


function B:New() --相当于重新重写A:New()

    local t={}

    setmetatable(t,self)

    self.__index=self

    return t

end

function B:func() --

    print(self,'这是派生类B表的Func函数')

    self.base:func()

    print('B:func 执行完成')

end


c=B:New() --二级派生类

c:func()

--[[

table: 00BA9938 这是派生类B表的Func函数

table: 00BA9488 这是基类A表的Func函数

B:func 执行完成

]]


d = B:New() --二级派生类

d:func()


--[[

table: 00BA98C0 这是派生类B表的Func函数

table: 00BA9488 这是基类A表的Func函数

B:func 执行完成

]]





作者:Czhenya

链接:https://czhenya.blog.csdn.net/article/details/78484215

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。