lua继承

Account = {balance = 0}
function Account:new (o)
o = o or {}
setmetatable(o, self)
self.__index = self
print("This is Base")
return o
end
function Account:deposit (v)
self.balance = self.balance + v
end
function Account:withdraw (v)
if v > self.balance then
error"insufficient funds"
end
self.balance = self.balance - v
end
SpecialAccount = Account:new()
function SpecialAccount:withdraw (v)
if v - self.balance >= self:getLimit() then
print("error insufficient funds")
return -1
end
self.balance = self.balance - v
end
function SpecialAccount:getLimit ()
return self.limit or 0
end
s = SpecialAccount:new{limit=1000.00}
--在Lua中面向对象有趣的一个方面是你不需要创建一个新类去指定一个新的行为.
--如果仅仅一个对象需要特殊的行为,你可以直接在对象中实现
function s:getLimit ()
return self.balance * 0.10
end
s:deposit(100.00)	--调用基类的存钱函数
print(s.balance)
s:withdraw(200.00)	--调用子类的取钱函数,取钱失败
print(s.balance)
s:getLimit()		--调用了s:getLimit ()
print(s.limit)
local _class={}

function class(super)
	local class_type={}
	class_type.ctor=false
	class_type.super=super
	class_type.new=function(...)
			local obj={}
			do
				local create
				create = function(c,...)
					if c.super then
						create(c.super,...)
					end
					if c.ctor then
						c.ctor(obj,...)
					end
				end

				create(class_type,...)
			end
			setmetatable(obj,{ __index=_class[class_type] })
			return obj
		end
	local vtbl={}
	_class[class_type]=vtbl

	setmetatable(class_type,{__newindex=
		function(t,k,v)
			vtbl[k]=v
		end
	})

	if super then
		setmetatable(vtbl,{__index=
			function(t,k)
				local ret=_class[super][k]
				vtbl[k]=ret
				return ret
			end
		})
	end

	return class_type
end


base_type=class()		-- 定义一个基类 base_type

function base_type:ctor(x)	-- 定义 base_type 的构造函数
	print("base_type ctor")
	self.x=x
end

function base_type:print_x()	-- 定义一个成员函数 base_type:print_x
	print(self.x)
end

function base_type:hello()	-- 定义另一个成员函数 base_type:hello
	print("hello base_type")
end

test=class(base_type)	-- 定义一个类 test 继承于 base_type

function test:ctor()	-- 定义 test 的构造函数
	print("test ctor")
end

function test:hello()	-- 重载 base_type:hello 为 test:hello
	print("hello test")
end

a=test.new(1)	-- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。
a:print_x()	-- 输出 1 ,这个是基类 base_type 中的成员函数。
a:hello()	-- 输出 hello test ,这个函数被重载了。

http://blog.codingnow.com/cloud/LuaOO

http://book.luaer.cn/_98.htm

http://blog.csdn.net/lqk1985/article/details/7190971

posted @ 2013-01-08 16:56  byfei  阅读(34)  评论(0编辑  收藏  举报