我们曾经一直使用的是OO实际却更像是Classification。
而真实世界的Object,实际上并没有诸如属性、继承、子类等等概念的。
对于真实世界的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的方法。
或许可以用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的方法。