lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现:

class.lua

local type = type
local rawset = rawset
local setmetatable = setmetatable local traceCount =
local tracebacks = setmetatable({}, {__mode = "k"}) local function class(classname, super)
local cls = {} cls.classname = classname
cls.class = cls
cls.Get = {}
cls.Set = {} local Get = cls.Get
local Set = cls.Set if super then
-- copy super method
for key, value in pairs(super) do
if type(value) == "function" and key ~= "ctor" then
cls[key] = value
end
end -- copy super getter
for key, value in pairs(super.Get) do
Get[key] = value
end -- copy super setter
for key, value in pairs(super.Set) do
Set[key] = value
end cls.super = super
end function cls.__index(self, key)
local func = cls[key]
if func then
return func
end local getter = Get[key]
if getter then
return getter(self)
end return nil
end function cls.__newindex(self, key, value)
local setter = Set[key]
if setter then
setter(self, value or false)
return
end if Get[key] then
assert(false, "readonly property")
end rawset(self, key, value)
end function cls.new(...)
local self = setmetatable({}, cls)
local function create(cls, ...)
if cls.super then
create(cls.super, ...)
end
if cls.ctor then
cls.ctor(self, ...)
end
end
create(cls, ...) -- debug
traceCount = traceCount +
tracebacks[self] = traceCount return self
end return cls
end return class

示例:

local class = require "class"

local Point = class("Point")

function Point:ctor(x, y)
self.x = x
self.y = y
end function Point.Get:x() return self._x end
function Point.Set:x(value) self._x = value end function Point.Get:y() return self._y end
function Point.Set:y(value) self._y = value end local p = Point.new(, )
print(p.x, p.y)
p.x =
p.y =
print(p.x, p.y)
local class = require "class"

local Sprite = class("Sprite")

function Sprite:ctor()
self.cobj = cc.Sprite:create()
end function Sprite.Get:x() return self.cobj:getPositionX() end
function Sprite.Set:x(value) self.cobj:setPositionX(value) end function Sprite.Get:y() return self.cobj:getPositionY() end
function Sprite.Set:y(value) self.cobj:setPositionY(value) end local obj = Sprite.new()
obj.x =
obj.y = obj.y = obj.x

这样做的好处就是,可以比较自然的访问和赋值一些变量,特别是UI布局中,可以少写很多setXX、getXX的方法。

lua Getter&Setter简单实现的更多相关文章

  1. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  2. lombok(@Getter&@Setter)

    Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法. 官方地址:https://project ...

  3. 自动生成getter setter

    如何使用java黑魔法给一个entity生成getter,setter方法? 由于java是一门静态语言,要给一个类动态添加方法,看似是不可能的.但牛B的程序员会让任何事情发生.我只知道有两种方式可以 ...

  4. idea中使用插件lombok简化java bean的getter/setter/log等常用功能

    一.安装. 1. 2. 3. 4. . 二.使用 1. 2. 3. 结果分析,如果没有添加@Setter注解,则LombokTest中的student示例无法使用setAge()等方法.使用lombo ...

  5. 懒加载(getter\setter理解)

    为什么要用懒加载 1.首先看一下程序启动过程:(如图) 会有一个mian的设置,程序一启动会加载main.storyboard main.storyboard又会加载箭头所指的控制器 控制器一旦加载, ...

  6. iOS getter setter

    getter setter 给成员变量起名字用的 setter方法 设置成员变量值 1. setter 方法一定是对象方法 不可能是类方法 2.一定没有返回值 3. 以set开头,并且set后面跟上需 ...

  7. cocos2d-x lua与c++简单交互

    cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...

  8. Lombok(1.14.8) - @Getter, @Setter, @ToString, @EqualsAndHashCode & @Data

    @Getter / @Setter @Getter 和 @Setter,分别实现了 Gette r和 Setter 方法. package com.huey.hello.bean; import ja ...

  9. lombok @Getter @Setter 使用注意事项

    lombok是一个帮助简化代码的工具,通过注解的形式例如@Setter @Getter,可以替代代码中的getter和setter方法,虽然eclipse自带的setter.getter代码生成也不需 ...

随机推荐

  1. Sql 常用时间转换

    CONVERT(varchar(100), GETDATE(), 0); -- 08 31 2015 04:57PM CONVERT(varchar(100), GETDATE(), 20); --2 ...

  2. java通用的方法整理

    判断字符串是否为空 public static boolean IsEmpty(String str){ if (str == null){ return true; } if ("&quo ...

  3. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  4. jQuery编程最佳实践笔记

    优化选择器   选择器优化已经不如从前那么重要,因为更多的浏览器实现了document.querySelectorAll()方法,所以选择的重担由jQuery转移到了浏览器. 但是仍然有一些技巧是需要 ...

  5. Permutation

    (M) Permutations (M) Permutations II (M) Permutation Sequence (M) Palindrome Permutation II

  6. 基于HTML5的网络拓扑图

    电信网管系统中,设备状态信息的实时展示非常重要,通常会挂载一堆图标来展示状态或告警信息,图标的信息量有限,有时需要更详细的面板,甚至以图表的形式展现,本文将结合最近客户提到的需求,使用 Qunee1. ...

  7. 新建jfinal2.2项目并连接mysql

    一新建项目 1. new→Dynamic  Web Project 2修改Default Output Folder.一般用WebRoot\WEB-INF\class,然后下一步(注意路径要写对,不然 ...

  8. 输入两个正整数m和n,求其最大公约数和最小公倍数

    public static void main(String[] args){  Scanner sc = new Scanner (System.in);  int a,b;  System.out ...

  9. ASP.NET常用函数(参考用)

    Abs(number) 取得数值的绝对值. Asc(String) 取得字符串表达式的第一个字符ASCII 码. Atn(number) 取得一个角度的反正切值. CallByName (object ...

  10. javaweb学习总结 servlet开发(一)

    转载:http://www.cnblogs.com/xdp-gacl/p/3760336.html 这里主要是将其加入自己的理解过一遍. 这里的代码全在eclipse java ee中执行的. 一.s ...