オブジェクト指向の lua (メタテーブルの設定) についてかなり読んだことがあり、継承を備えたシステムを構築しました。
私の問題は、いくつかの変数が互いに漏れているように見えることです。関数と呼ばれるwindow:click(x, y)
関数を呼び出すと、関数は問題なく呼び出されます。この関数の役割は、すべてのコンポーネントにクリックを通知することです。それは何をしている
for number, component in pairs(self.components) do
component.focus = false
component:click(x, y, msg)
end
self.components
ウィンドウのすべてのコンポーネントが含まれています
component.lua というクラスを持っているすべてのコンポーネントの基本クラスとして機能するために、このファイルは components というテーブルを作成し、それにcreate()
メソッドを追加します (通常の OO lua のすべてを実行します)。この基本クラスにはすべてのメソッドが含まれ、変数を含むすべてのコンポーネントで必要な変数component:click(x, y)
が呼び出されます。
for key, callback in pairs(self.clickCallback) do
callback()
end
return
clickCallback
テーブルには、コンポーネントが通知されたときに呼び出される関数が含まれています。component.lua 内で初期化されます
ここから、新しいコンポーネント (テキストボックス、ボタン、ラベルなど) のメタテーブルを設定するだけで、このクラスを他のクラスに継承します。これらのコンポーネントはself.components
、ウィンドウ内のテーブルに追加されるものです。
問題は、これらの各コンポーネントに独自の clickCallback テーブルが必要なことです。私はセッターを介して書いていますcomponent.lua
function component:addClickHandler(handler)
table.insert(self.clickCallback, handler)
end
しかし、click(x,y)
あるコンポーネントを呼び出すと、別のボタンであろうとラベルであろうと、すべての clickHandlers が呼び出されます。
上記のように、focus
これと呼ばれるパラメーターを設定していますが、同じ問題が発生しているようです.1つのコンポーネントに設定すると(各コンポーネントをループしているのがわかります)、すべてに設定されます(したがって、4つのコンポーネントがある場合)フォーカスは各コンポーネントで 4 回リセットされます)
lua がこれを行うのはなぜですか? また、それを修正するにはどうすればよいですか?