はい、既存のエクスポートされたクラスに新しいメソッドを追加することは可能です。
フーバーは単純なテーブルなので、他のテーブルと同じようにメソッドをアタッチできます。 [1]
Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end
をし、今あなたが行うことができます。
Foobar:extra_method(1,2)
と1 2
が表示されます。
[1] tolua ++はやや奇妙に動作します。クラスの静的メンバー関数(たとえば、Foobar:new()
)とのクラスのインスタンスメンバー関数(たとえば、Foobar:method1()
と思われるもの)の両方を保持する、Foobarとして表示される各クラスのメインテーブルを1つ作成します。 luaの:
演算子は構文的砂糖です。 a:b()
はa.b(a)
に変換されます。これは、Foobar:new()
に電話すると、Foobar:new(Foobar)
に転記されるため、self
引数はFoobarテーブルになります。 Foobar型のオブジェクトを作成し、その上でmethod1()を呼び出すと、self
がそのオブジェクトになります。したがって、新しいメソッドmethod3
をFoobarテーブルに追加すると、Foobar:method3()
とobj = Foobar:new(); obj:method3()
が実行されますが、前者はエラーになります。したがって、この回答はtolua ++でしか動作しません。
編集:コメント
私はここに実際のコードを使用してみましょうに対処します。それでは、私たちがどのように見えるFOOBARのクラス宣言を持っていると仮定してみましょう:
class Foobar {
public:
void method1();
static void method2();
};
tolua ++はこのクラスのLUAバインディングコードを生成するとき、(次の方法
- 新しいとあなたのテーブルを与えるために起こっています) -
Foobar:new()
と呼んで、Foobarのインスタンスを作成します。
- delete() -
instance:delete()
として呼び出し、Foobarのインスタンスを破棄します。
- method1() -
instance:method1()
と呼び、instance1でmethod1を実行します。
- method2() - 方法2を実行するには
Foobar:method2()
と呼び出します。
しかし、tolua ++は実際には2つの異なるテーブルを使用しません(クラス自体に接続するメソッドとそのクラスのインスタンスのメソッドに1つずつ)。代わりに、2つのファイルをマージするので、メソッドの使用方法ではありませんが、Foobar:method1()
とinstance:new()
を実行することは可能です。したがって、静的メソッドの使用方法とインスタンスメソッドの使用方法には違いはありません。構文的にも同じです。 (私は個人的にこれは++ toluaに問題があると感じる)
あなたが例を探しているなら、ここにあなたがLUA内からこれらの関数を呼び出すする方法である。説明のため
obj = Foobar:new()
print(obj:method1())
obj:delete()
感謝。静的メソッドの呼び出し方法とインスタンスの呼び出し方法の違いはまだ分かりません。私は、Foobarという名前のクラスでメソッドの呼び出しを推測しています:Foobar:static_method()とfoobarvar:instance_method()? – skyeagle
既存のC++メソッドも上書きできますか? C++メソッドをREADONLYにする方法はありますか(つまり、C++メソッドが代入によって上書きされないようにする) – skyeagle
はい、既存のC++メソッドを同じ方法で上書きできます。既存のメソッドの名前を使用します。 読み取り専用テーブルを作成することは簡単ではなく、完全ではありません。こちらをご覧ください:http://lua-users.org/wiki/ReadOnlyTables –