使用Lua进行面向对象编程,一种新的样式

本文探讨了在Lua中如何通过标签(Label)的概念来实现对象的动态行为,并提供了一种简化对象创建和方法定义的方法。

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

 我们曾经一直使用的是OO实际却更像是Classification。
而真实世界的Object,实际上并没有诸如属性、继承、子类等等概念的。
对于真实世界的Object,只有当人类试图去认识它时,会人为的放上一种标签。
比如,一块奇形怪状的石头,也许被放上了标签“雕塑”,原来,这块石头曾经过人工雕琢的。
而有时,我们确只想用“石头”甚至于“物体”的标签来形容它。比如它砸伤了我。
(指代的时候我们可能会使用“这个雕塑”,但是这并不意味着我们使用“雕塑”这个标签)

或许可以用lua尝试这种概念。
以下是代码。

__Label = {};

__Label.__index = function(self, key)
    return rawget(self, "_mt")[key];
end
function __Label:__newindex (key, value)
    rawget(self, "_mt")[key]=value;
end

function __SetLabel(object, label)
    setmetatable(object, rawget(label, "_mt"));
end

function __CreateLabel( name )
    local _label = {};
    _label.name = name;
    _label._mt = {};
    _label._mt.__index =_label._mt;

    setmetatable(_label, __Label);
    return _label;
end

使用方法很简单。
创建一个Label
someLabel = __CreateLabel("SomeName");
为这个Label定义方法属性。
function someLabel:DoSomeThing() end
someLabel.someProperty = 0;

注意,someLabel.DoSomeThing,someProperty 的实际创建位置是
someLabel._mt.DoSomeThing
someLabel._mt.someProperty

随后我们可以定义一个object
someObject = {};
__SetLabel(someObject,  someLabel);

现在,我们可以调用 someObject:DoSomeThing()
它实际调用的是someLabel.DoSomeThing

当然我们也可以覆盖这个方法
function someLabel.DoSomeThing ()
    print ( "own do some thing");
end

以后再调用 someLabel.DoSomeThing() 就是直接调用此了。

这样做了之后
可以使每次创建类和对象的过程变得简单。
不用每次写些setmetatable,和__index,或者__newindex了。

也不必像program in lua 内本书所介绍的,每次都要写一个几乎雷同的 Class:New的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值