luaのクラスと継承


一部のオブジェクト向け言語では、オブジェクトを作成するテンプレートとしてクラスの概念が提供されています.これらの言語では、オブジェクトはクラスのインスタンスです.Luaにはクラスの概念は存在せず,各オブジェクトは自分の行為を定義し,自分の形状(shape)を持つ.これらの言語では、オブジェクトにはクラスがありません.逆に、各オブジェクトにはprototype(プロトタイプ)があり、オブジェクトに属さないいくつかの操作を呼び出すと、prototypeで最初にこれらの操作が検索されます.このような言語でクラス(class)を実現するメカニズムでは、他のオブジェクトのプロトタイプとしてオブジェクトを作成します(プロトタイプオブジェクトはクラス、他のオブジェクトはクラスのinstance).クラスはprototypeの動作メカニズムと同様に、特定のオブジェクトの動作を定義します.
extends.lua
Account = {    balance = 0}                        --     

function Account:deposit(v)                        --    
    self.balance = self.balance + v
end

function Account:new(o)                            --      
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
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
    error"insufficient funds"
    end
    self.balance = self.balance - v
end
function SpecialAccount:getLimit ()                --    
    return self.limit or 0
end

--      
s = SpecialAccount:new{limit=1000.00}            
s:deposit(100.00)
s:withdraw(200.00)
print(s.balance)