Luaにおける継承

基本オブジェクト指向ではない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でも一応オブジェクト指向できる。