2016年3月22日火曜日

Luaでクラスの継承

__indexメタメソッドを利用する。

テーブルに対してキー値を参照する場合、
  1. 対象テーブル
  2. 1のテーブルのメタテーブル内の__indexメタメソッドにセットされているテーブル
  3. 2のテーブルのメタテーブル内の__indexメタメソッドにセットされているテーブル
  4. ・・・
の順番に該当キーが見つかるまで探索される。
__indexメタメソッドに基底クラスをセットする事で継承関係を実現出来る。

function createClass( baseClass )
    local new_class = {}
    local class_mt = { __index = new_class }

    function new_class:create()
	return setmetatable( {}, class_mt )
    end

    if baseClass then
	setmetatable( new_class, { __index = baseClass } )
    end

    return new_class
end

baseClass = createClass()
function baseClass:setValue(value)
    self.value = value
end
function baseClass:show()
    print( string.format("baseValue is %s", self.value) )
end

inheritedClass = createClass( baseClass )
function inheritedClass:show()
    print( string.format("inheritedValue is %s", self.value) )
end

baseInstance = baseClass:create()
baseInstance:setValue(10)
baseInstance:show()

inheritedInstance = inheritedClass:create()
inheritedInstance:setValue(20)
inheritedInstance:show()

上記サンプルコードでは、
  • 基底クラスでのみsetValue関数を定義し、派生クラス側でも利用できる事
  • 派生クラスで定義したshow関数が基底クラスの同関数をオーバーライドする事
を確認している。

[参考]

0 件のコメント:

コメントを投稿