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)