誰もが知っているように、luaにはそのようなクラスやオブジェクトはありません。 ただし、メタテーブルと構文糖があります。
これらのメカニズムを使用すると、クラスの類似性を実装するのに十分簡単です。
結果は次のようになります。
もちろん、これはすべて良いことです。特定の器用さを備えていても、継承を実現できます。
しかし、パブリッククラスとプライベートクラスのメンバーはどこにいますか? 実際、この例ではすべて公開されています。 はい、コロンの使用場所を覚えておく必要があります。
MyClass:myFunc()
そして、ほんの一点だけです:
MyClass.myOtherFunc()
そして、クラスの静的メンバー? 本当に拒否する必要がありますか?
だから私は拒否したくなかったし、集団農場を始めた...
それで、私はあなたに私の集合農場を紹介します:
私の集団農場 createClass = function() local creator = {} creator.__private = { object_class = {}, } creator.__oncall = function(class_creator)
そして、それを使用する方法は? 非常に簡単です、ここにあなたのためのテンプレートがあります:
myclass_prototype = function() local this = {} this.__public_static = {
ご覧のとおり、クラス内から呼び出すたびに、「this .__ private.privdata」のパスを毎回指定する必要がありますが、作成したクラスの使用例を次に示します。
myobject = myclass() myobject.pubfunc(999)
このコードが呼び出されると、myclassクラスからmyobjectオブジェクトが作成され、pubfunc関数が呼び出されます。これにより、パブリック変数の内容が強調表示され、プライベート変数が変更されます。
そして、コロンの問題はありません!
ところで、静的呼び出しも機能します。 クラスとオブジェクトの両方から。
そこで、ここでどのような魔法が起こるかを簡単に説明します。 そして、ここでいわゆるアップバリューとジャグリングがあります。 アップバリューは、内部からは見えるが外部からは見えない変数です! プライベートに非常に似ていますよね?
そのため、「プロトタイプ」関数を作成した後、新しいスコープを作成し、クラスのすべての内部をそのクラスに配置し、クラスのパブリックおよびパブリック静的メンバーのみを取り出しました。 そして、残りの魔法はメタテーブルによって実行され、クラス/オブジェクトを表す外部テーブルの「存在しない」メンバーをリクエストしたときに何が起こるかを正確に決定できます。
混乱しているように聞こえますが、説明はできません-特別ではありません:)
私は長い間、そのようなシステムで継承を行う方法を考えましたが、私はそれを思いつきませんでした-アップバリューは私たちの行動を真剣に制限し、デバッグライブラリのような倒錯を使用したくありませんでした-それは常に含まれていません。 誰もがそれを考えるなら、私は見てうれしいです!
PS:私の投稿が誰かにとって明白なものである場合-それで、私は自分自身を過大評価しています:)厳密に判断しないでください。