Luaにおける継承
Base = {} function Base.new(value) local base = { value_ = value, hoge = function(self) return self.value_; end, toString = function(self) return "base" end, } return base end Derivation = {} function Derivation.new(value) local derivation = { toString = function(self) return "derivation" end, } local extends = Base.new(value) setmetatable(derivation,{__index=extends}) return derivation end obj1 = Base.new(100) obj2 = Derivation.new(999) print (obj1:hoge()) print (obj1:toString()) print (obj2:hoge()) print (obj2:toString())
で、
100
base
999
derivation
という出力が得られる。
Derivationはhogeというメソッドを持っていないが、
ちゃんとBaseから受け継いでいるし、
toStringはDerivationのものが使われる。
要するに「setmetatable」というものが種になっていて、
メタテーブルによってDerivationインスタンスにBaseインスタンスを設定しておくと、
Derivationインスタンスでメソッドなどが呼び出されたとき、
もし見つからなければBaseインスタンスを探しに行く、
という仕組みになっている。
上記では、extendsというインスタンスを仕込んであるので、
derivationで見つからなければそれを見に行くという訳だ。
ということでLuaでも一応オブジェクト指向できる。