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