如何将Lua流水账4面向对象改写为长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计670个文字,预计阅读时间需要3分钟。
1. 类的示例:`Account={'balance': 0, 'withdraw': function(self, v) { print('this is withdraw'); self.balance=self.balance - v; }}`
2.使用示例:`可以使用` Account `隐藏` self `function` `deposit(v)`。
1.类的示例:
Account = { balance = 0; --self相当于this withdraw = function(self,v) print("this is withdraw"); self.balance = self.balance - v; end } --使用:可以隐藏self function Account:deposit(v) print("this is deposit"); self.balance = self.balance + v; end Account.deposit(Account,200.00); Account.withdraw(Account,100.00); Account:deposit(200.00); 输出是:this is deposit this is withdraw this is deposit
Account = { balance = 0; list = {}; ownList = {}; } function Account:new(o) o = o or {}; setmetatable(o,self); self.__index = self; return o; end function Account:deposit(v) print("this is deposit"); self.balance = self.balance + v; end function Account:addList(key,value) self.list = self.list or {}; self.list[key] = value; end function Account:addOwnList(key,value) self.ownList = self.ownList or {}; self.ownList[key] = value; end a = Account:new{balance = 0,ownList = {}} a:deposit(100.00) print(a.balance); print(Account.balance); a:addList("key","value"); print(a.list["key"]); print(Account.list["key"]); a:addOwnList("key","value"); print(a.ownList["key"]); print(Account.ownList["key"]); 输出是:this is deposit 100.0 0 value value value nil
2.类继承
Account = {balance = 0} function Account:new(o) o = o or {}; setmetatable(o,self); self.__index = self; return o; end function Account:deposit(v) print("this is Account:deposit"); self.balance = self.balance + v; end function Account:withdraw(v) print("this is Account:withdraw") if v > self.balance then error "insufficient funds" end self.balance = self.balance - v; end SpecialAccount = Account:new(); function SpecialAccount:withdraw(v) print("this is SpecialAccount:withdraw"); if v - self.balance > self:getLimit() then error "insufficient funds"; end self.balance = self.balance - v; end function SpecialAccount:getLimit() print("this is SpecialAccount:getLimit"); return self.limit or 0; end s = SpecialAccount:new{limit = 1000.00} function s:getLimit() print("this is s:getLimit"); return self.balance * 0.10; end s:deposit(100.00); s:withdraw(10); 输出是:this is Account:deposit this is SpecialAccount:withdraw this is s:getLimit
3.多重继承
local function search(k,plist) for i = 1,table.getn(plist) do local v = plist[i][k]; if v then return v end; end end function createClass(...) local c = {}; setmetatable(c,{__index = function(t,k) return search(k,arg); end}) c.__index = c; function c:new(o) o = o or {}; setmetatable(o,c); return o; end return c; end Named = {}; function Named:getname() return self.name; end function Named:setname() self.name = n; end Account = {balance = 0}; NamedAccount = createClass(Account,Named); account = NamedAccount:new{name = "Paul"}; print(account:getname());
4.类的私有性
function newAccount(initialBalance) local self = { balance = initialBalance, LIM = 10000.00, }; local withdraw = function(v) self.balance = self.balance - v; end local deposit = function(v) self.balance = self.balance + v; end local extra = function() if self.balance > self.LIM then return self.balance * 0.10; else return 0; end end local getBalance = function() return self.balance + extra() end; return { withdraw = withdraw, deposit = deposit; getBalance = getBalance } end acc1 = newAccount(100.00); acc1.withdraw(40.00); print(acc1.getBalance());
5.Single-Method即对象只有一个单一的方法,这种情况下,我们不需要创建一个接口表,取而代之的是,我们将这个单一的方法作为对象返回。
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")); d("set",10); print(d("get"));
本文共计670个文字,预计阅读时间需要3分钟。
1. 类的示例:`Account={'balance': 0, 'withdraw': function(self, v) { print('this is withdraw'); self.balance=self.balance - v; }}`
2.使用示例:`可以使用` Account `隐藏` self `function` `deposit(v)`。
1.类的示例:
Account = { balance = 0; --self相当于this withdraw = function(self,v) print("this is withdraw"); self.balance = self.balance - v; end } --使用:可以隐藏self function Account:deposit(v) print("this is deposit"); self.balance = self.balance + v; end Account.deposit(Account,200.00); Account.withdraw(Account,100.00); Account:deposit(200.00); 输出是:this is deposit this is withdraw this is deposit
Account = { balance = 0; list = {}; ownList = {}; } function Account:new(o) o = o or {}; setmetatable(o,self); self.__index = self; return o; end function Account:deposit(v) print("this is deposit"); self.balance = self.balance + v; end function Account:addList(key,value) self.list = self.list or {}; self.list[key] = value; end function Account:addOwnList(key,value) self.ownList = self.ownList or {}; self.ownList[key] = value; end a = Account:new{balance = 0,ownList = {}} a:deposit(100.00) print(a.balance); print(Account.balance); a:addList("key","value"); print(a.list["key"]); print(Account.list["key"]); a:addOwnList("key","value"); print(a.ownList["key"]); print(Account.ownList["key"]); 输出是:this is deposit 100.0 0 value value value nil
2.类继承
Account = {balance = 0} function Account:new(o) o = o or {}; setmetatable(o,self); self.__index = self; return o; end function Account:deposit(v) print("this is Account:deposit"); self.balance = self.balance + v; end function Account:withdraw(v) print("this is Account:withdraw") if v > self.balance then error "insufficient funds" end self.balance = self.balance - v; end SpecialAccount = Account:new(); function SpecialAccount:withdraw(v) print("this is SpecialAccount:withdraw"); if v - self.balance > self:getLimit() then error "insufficient funds"; end self.balance = self.balance - v; end function SpecialAccount:getLimit() print("this is SpecialAccount:getLimit"); return self.limit or 0; end s = SpecialAccount:new{limit = 1000.00} function s:getLimit() print("this is s:getLimit"); return self.balance * 0.10; end s:deposit(100.00); s:withdraw(10); 输出是:this is Account:deposit this is SpecialAccount:withdraw this is s:getLimit
3.多重继承
local function search(k,plist) for i = 1,table.getn(plist) do local v = plist[i][k]; if v then return v end; end end function createClass(...) local c = {}; setmetatable(c,{__index = function(t,k) return search(k,arg); end}) c.__index = c; function c:new(o) o = o or {}; setmetatable(o,c); return o; end return c; end Named = {}; function Named:getname() return self.name; end function Named:setname() self.name = n; end Account = {balance = 0}; NamedAccount = createClass(Account,Named); account = NamedAccount:new{name = "Paul"}; print(account:getname());
4.类的私有性
function newAccount(initialBalance) local self = { balance = initialBalance, LIM = 10000.00, }; local withdraw = function(v) self.balance = self.balance - v; end local deposit = function(v) self.balance = self.balance + v; end local extra = function() if self.balance > self.LIM then return self.balance * 0.10; else return 0; end end local getBalance = function() return self.balance + extra() end; return { withdraw = withdraw, deposit = deposit; getBalance = getBalance } end acc1 = newAccount(100.00); acc1.withdraw(40.00); print(acc1.getBalance());
5.Single-Method即对象只有一个单一的方法,这种情况下,我们不需要创建一个接口表,取而代之的是,我们将这个单一的方法作为对象返回。
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")); d("set",10); print(d("get"));

