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 ,这个函数被重载了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。