Lua クラスの継承のような実装のサンプル

目次

 

クラスの継承のような実装のサンプル

Luaでは __indexを使用することで、クラスのような仕組みで、継承することもできます。

Color1  = {}

function Color1 :new(name)
    local obj = {name = name}
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function Color1 :getName1()
    print("red")
end

-- Color2 クラス(Color1  を継承)
Color2 = setmetatable({}, {__index = Color1 })

function Color2:getName2()
    print("blue")
end

local Color2 = Color2:new()
Color2:getName1()  -- red
Color2:getName2()  -- blue

Color1が親クラスでColor2が子クラスです。

21行目のColor2:new()を呼ぶと、Color1:new()が呼ばれてobjが作成されます。
23行目は、Color2:getName2()を呼ぶと、Color2内にgetName2があるので、それが実行されます。
22行目は、Color2にはgetName1がないので__indexによるメソッド検索でColor1:getName1が呼ばれます。

22行目は、親クラスのColor1のメソッドを実行しています。
→Color2クラスは、親クラスのメソッドを再実装しないで済んでいます。継承です。

関連の記事

Lua 配列(テーブル)にキーが存在しないとき(__indexメタメソッド)
Lua クラスのような実装のサンプル

△上に戻る