Lua Single--Method 的对象实现方法(面向对象程序设计)

前面的 OO 程序设计的方法有一种特殊情况:对象只有一个单一的方法。这种情况下,我们不需要创建一个接口表,取而代之的是,我们将这个单一的方法作为对象返回。

这听起来有些不可思议,如果需要可以复习一下 7.1 节,那里我们介绍了如何构造迭代子函数来保存闭包的状态。其实,一个保存状态的迭代子函数就是一个 single-method 对象。

关于 single-method 的对象一个有趣的情况是:当这个 single-method 实际是一个基于重要的参数而执行不同的任务的分派(dispatch)方法时。针对这种对象:

function newObject (value) 
return function (action, v) 
 if action == "get" then return value 
 elseif action == "set" then value = v 
 else error("invalid action") 
 end 
end 
end 
使用起来很简单:
d = newObject(0) 
print(d("get")) --> 0 
d("set", 10) 
print(d("get")) --> 10 

这种非传统的对象实现是非常有效的,语法 d(“set”,10)虽然很罕见,但也只不过比传统的 d:set(10)长两个字符而已。每一个对象是用一个单独的闭包,代价比起表来小的多。这种方式没有继承但有私有性:访问对象状态的唯一方式是通过它的内部方法。

Tcl/Tk 的窗口部件(widgets)使用了相似的方法,在 Tk 中一个窗口部件的名字表示一个在窗口部件上执行各种可能操作的函数(a widget command)。

发布了290 篇原创文章 · 获赞 153 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39885372/article/details/104404848