美文网首页
Lua实现面向对象

Lua实现面向对象

作者: Mad_Elliot | 来源:发表于2018-12-26 15:34 被阅读0次

注:只是仿照,并不是真正的面向对象
C#中是用this表示当前类的对象,Lua中使用self
点(.)与冒号(:)的区别:前者需要手动调用self参数,后者隐藏self参数

借助table实现面向对象:

Person = {      -- 创建一个person类
    name = "",
    age = 0
}
function Person.Setvalue(self, _name, _age) --类方法
    self.name = _name
    self.age = _age
end
function Person.Getvalue(self)  --类方法
    return self.name, self.age
end

local p1 = Person   --创建对象
p1.Setvalue(p1, "小明", 18)
local n, a = p1.Getvalue(p1)

local p2 = Person   --创建对象
p2.Setvalue(p2, "小东", 22)
local nn, aa = p2.Getvalue(p2)

print(nn .. '\t' .. aa)
print(n .. '\t' .. a)

使用冒号(:)形式:

Person = {      -- 创建一个person类
    name = "",
    age = 0
}
function Person:Setvalue(_name, _age) --类方法
    self.name = _name
    self.age = _age
end
function Person:Getvalue()  --类方法
    return self.name, self.age
end

local p1 = Person   --创建对象
p1:Setvalue("小明", 18)
local n, a = p1:Getvalue()

local p2 = Person
p2:Setvalue("小东", 22)
local nn, aa = p2:Getvalue()

print(nn .. '\t' .. aa)
print(n .. '\t' .. a)

说明:这里所谓的创建对象就是直接调用了父类表,创建多个对象也是指向同一处地方,一个对象数据变化其他对象也跟着变。所以这样的面向对象,创建一个对象还行,创建多个对象不适用。


继承实现:

利用__index实现继承:将子类表的元表和__index方法都设置为父类自身,子类没有的东西会自动搜索__index表(即父类表),相当于父类表的东西都继承给了子类表。

-----------父类----------------
Person = {
    name = "",
    age = 18,
    gender = "" 
}

function Person:New(tab)
    tab = tab or {}
    setmetatable(tab, self)
    self.__index = self
    return tab
end

function Person:Eat()
    print(self.name .. "都会吃东西")
end

function Person:Init(name, age, gender)
    self.name = name
    self.age  = age
    self.gender = gender
end

function Person:GetInfo()
    return self.name, self.age, self.gender
end

--------------子类对象----------------
Chinese = Person:New({height = 180, looklike = "帅气"})
Chinese:Init("中国人", 5000, "男")
Chinese:Eat()
American = Person:New({})
American:Init("美国人", 1000, "女")
American:Eat()

function American:Sing()
    print(self.name .. "唱歌挺好听的")
end
American:Sing()

print(Chinese:GetInfo())
print(American:GetInfo())

中国人都会吃东西
美国人都会吃东西
美国人唱歌挺好听的
中国人 5000    男
美国人 1000    女

说明:
1、子类有单独的表,一个子类表中数据的改变不会影响其他子类变化;
2、相当于直接实例化出来了子类对象,能调用父类表中的变量与方法,同时自身也可以定义新的变量与方法。

相关文章

  • 大话C与Lua(五) 面向对象的数据结构——userdata

    如何实现面向对象? 熟悉Lua的同学都知道!在Lua内部已经实现了面向对象的基本机制(table), 同时也为宿主...

  • Lua面向对象实现

    这个类主要是把基类和派生类绑定起来,并且调用ctor构造函数用法如下 注意调用父类的方法要用"."别用":"是因为...

  • Lua实现面向对象

    注:只是仿照,并不是真正的面向对象C#中是用this表示当前类的对象,Lua中使用self点(.)与冒号(:)的区...

  • 2018-08-02

    lua实现继承,重载和多态(上) *讲到lua的继承等面向对象的实现,首先得讲一下lua中的几个元方法和元表. s...

  • lua实现多继承

    lua对于面向对象的支持主要通过table来实现,每个table都是一个对象,对于继承,lua有元表的机制,通过s...

  • Lua 实现面向对象 (原创)

    要理解Lua是如何实现面向对象的。首先要熟悉Lua元表的相关知识,可以阅读我上一篇文章《Lua元表 (Metata...

  • Lua实现面向对象机制

    开篇废话 最近重拾了Lua,因为新项目在用。大概4-5年前准备进入从事游戏行的时候,看到某司的招聘简章中提到了Lu...

  • lua实现class(面向对象)

    用惯了python,觉得python真的好写。相比起来lua简直是一坨屎。拿lua开发的话,面向对象还是必不可少的...

  • 对lua中类、实例、继承的理解

    lua底层有__index等表,去实现类,实例、继承。但是比较绕。 参考1.1.5.Lua语言面向对象之复制表的方...

  • Lua实现继承

    Lua元表使用 中的__index元方法可以实现面向对象和继承关系: lua中没有类的概念,只有table,但可以...

网友评论

      本文标题:Lua实现面向对象

      本文链接:https://www.haomeiwen.com/subject/qcshlqtx.html