lua流水账4:面向对象

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"));
相关文章
相关标签/搜索