LUA仮想クラス側での実装の吸収
フレームワーク続報です。
Lua上にて、親となる仮想クラスを実装して、その上に押し決め(プリセット)の関数をもうけました。
未定義のプロパティに対して、フックをかませることが出来るので、読み書きについては、
たとえば仮想クラスの未定義メソッドについて、
読み書きは親フレームワークの変数を読み書きできるようにする、実装ができました。
たとえば、SetHashInt、GetHashIntという関数を親フレームワーク側で設けて、
そのやり取りをLua側にて、クラス名.int.(連想配列名)で、親フレームワーク側との引数をやり取りする方法は以下。
-- 基本となる Actor クラスを定義 Actor = {} Actor.new = function (name) local obj = {} -- 自クラスの名前 obj.name = name -- 宣言時 存在しない値の場合 親フレームワーク側の連想配列を数値で読み書きするように定義する obj.setDefaultInt = function (t) local mt = { -- テーブルへのアクセス __index = function (ft,fk) local value = 0 -- Log('__index:'.. fk) value = GetHashInt(a, fk) return value end, -- テーブル更新 __newindex = function (ft,fk,fv) -- Log('__newindex:'.. tostring(ft) .. '/' .. fk .. '/' .. tostring(fv)) SetHashInt(a, fk, fv ) end } setmetatable(t,mt) end return obj }
呼び出し例 (クラス例追記)
-- Actor を継承して Dog クラスを作る Dog = {} Dog.new = function (self) local obj = Actor.new(self) obj.int = {} obj.str = {} -- 関数 obj.bark = function (self) tempmerge(self.name..":bowwow!") end return obj end -- インスタンスを生成する local jiro = Dog.new("jiro") -- 未定義値に対してフックをかけ デフォルト入力時の動作に対応する関数追記 jiro.setDefaultInt( jiro.int )
こうすることで、int型として、jiro.int.hogehogeという形で、シームレスに型を明示した変数として扱うことが可能になります。
ある程度以上の過度に複雑な実装を親フレーム側で行うより、
最小限の関数を親で作成した後は、大いに、組み込み言語側で吸収できることを示唆する解決方法でした。
(追記) 八角研究所 - メタテーブルを利用しないで、継承を再現する例
http://www.hakkaku.net/articles/20081118-286
を参考にしてクラスを構成させていただいております。
(11:50-12:20)