Lua模拟面向对象(O-O)

本文介绍如何使用Lua语言模拟面向对象编程中的封装、继承与多态特性,并通过具体代码示例展示了Lua作为胶水语言的强大定制与拓展能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lua是一门非常容易上手的脚本语言
超EASY的哦!

特点:
       轻量
       开发效率高

可嵌入在C/C++,Java, Ruby等语言当中,是很好用的”胶水语言”
Lua提供面向过程式编程, 同时可以模拟面向对象(O-O)

0.问题描述

总所周知,面向对象(O-O)语言的三大特性:封装, 继承与多态
接下来,俺就使用Lua来模拟面向对象(O-O), 体现这三个特性

1.Lua模拟类(Class)

O-O语言里一个重要的概念就是类(class)
然而,Lua里面没有类的概念
好在
Lua是一门可以定制和拓展的语言
将Lua改造成伪O-O是MU有问题滴!
这里要用到Lua里面很屌的一个类型: table
这玩意儿不错,里边可以放变量,放函数,放table,…

-- table, 用于模拟类Beauty
Beauty = {}

-- 变量
Beauty.name = ""

-- 函数
Beauty.setName = function (name)
    Beauty.name = name
end

Beauty.getName = function ()
    return Beauty.name
end


-- 构造函数
function Beauty.new()
    tmp = {}
    for k,v in pairs(Beauty) do
        tmp[k] = v
        print(k, v) -- 这里的打印结果可以帮你看到函数做了什么事情
    end

    return tmp
end


-- 创建一个类的实例
kato = Beauty.new()

-- 调用类函数
kato.setName("Kato")

print(kato.getName()) -- 打印结果: Kato

语法效果是真的清秀

2.模拟继承(Inherit)

继承, 描述的是”is-a”关系,Lua是怎样实现的呢?
我们知道,继承接口继承实现继承之分
Lua在继承时使用的是metatable中的__index
metatable是什么?传送门
在Lua里, 有了metatable的概念,实现继承是很容易的
然而
我这里的例子并没有用metatable

-- table, 用于基类Beauty
Beauty = {}

-- 基类变量
Beauty.name = ""

-- 基类函数
Beauty.setName = function (name)
    Beauty.name = name
end

Beauty.getName = function ()
    return Beauty.name
end


-- 基类构造函数
function Beauty.new()
    tmp = {}
    for k,v in pairs(Beauty) do
        tmp[k] = v
        print(k, v)
    end

    return tmp
end

-------------------------------------
-------------------------------------

-- table, 用于继承类Kato
Kato = {}

------------------ 
-- 继承在这里! ---

-- 继承Beauty类
Kato = Beauty.new()

-- 继承类自己的变量
Kato.personalEnjoy = "nothing"

-- 继承类自己的函数
Kato.personalDesc = function ()
    print("hello, I'm kato")
end

-- 继承类的new方法
Kato.new = function ()
    tmp = {}

    for k, v in pairs(Kato) do
        tmp[k] = v
    end

    return tmp
end




-- 创建一个类的实例
kato = Kato.new()

-- 调用父类函数
kato.setName("Kato")

print(kato.getName()) -- 打印结果: Kato
kato.personalDesc()   -- 打印结果: hello, I'm kato

当然,细心的童鞋会发现
我这里实现是有潜在问题的
什么问题呢?
提示: deep copy

3.模拟多态(Polymorphism)

Lua语言动态类型的特性
指针多态
很容易的啦
根据第二个部分,我们再加几行

-- 标注 ... 的代码与第2部分模拟继承一模一样
...
-- 添加的几行
kato = Beauty.new()
kato.setName("beauty")
print(kato.getName()) -- 打印结果: beauty

kato = Kato.new()
kato.setName("megumi")
print(Kato.getName()) -- 打印结果: megumi

4.小结(Conclude)

Lua是不错的胶水语言
metatable很不错哦(我正在学习中), 有机会一定去尝试下
好玩 !
谢谢观阅, 下次再见 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值