ルアは、しばしばプロトタイプベースの継承を持つものとして記述されます(たとえば、this answer)。しかし、 "Programming in Lua"の"Inheritance" sectionは、 "ベースクラス"と "スーパークラス" - クラスベースの継承の用語について述べています。Luaの継承はプロトタイプベースかクラスベースですか?
プロトタイプベースまたはクラスベースのどのモデルが、Luaで継承がどのように機能するかを最もよく表しているモデルですか?
ルアは、しばしばプロトタイプベースの継承を持つものとして記述されます(たとえば、this answer)。しかし、 "Programming in Lua"の"Inheritance" sectionは、 "ベースクラス"と "スーパークラス" - クラスベースの継承の用語について述べています。Luaの継承はプロトタイプベースかクラスベースですか?
プロトタイプベースまたはクラスベースのどのモデルが、Luaで継承がどのように機能するかを最もよく表しているモデルですか?
ルアはプロトタイプベースです。
技術的には、何のクラスまたは相続または基底クラス、Luaの中スーパークラスはありません。 Luaには、古典的なOOPをシミュレートするためのメタテーブルのようなツールがいくつかあります。 PiL本がこれらの用語を使用する主な理由は、読者が理解しやすいようにすることです。
構文を説明する言語弁護士の方法が好きな場合は、the reference manualとお読みください。これらの用語はここでは見つかりません。
ルアはprototype-basedinheritance systemです。最初に、Luaにクラスがなく、すべてのオブジェクトが同じタイプ(table
)であることを理解してみましょう。クラスの概念を模倣するために、luaはメタテーブルを使用して、テーブル自体に定義されていないプロパティをテーブルに定義します。 2つのテーブルは同じ動作を共有することができます。なぜなら、我々はメタテーブルを持つオブジェクトを「プロトタイプ」できるからです。このようにして
table1 = {}
table2 = {}
behavior = {myfunction = function() return 10 end}
setmetatable(table1, behavior)
setmetatable(table2, behavior)
a.myfunction() --> 10
b.myfunction() --> 10
、table1
とtable2
は同じ行動を持っており、私たちは本当にちょうど2つの異なるテーブルに同じ動作を定義していても、同じ「クラス」を有すると考えることができます。
継承の概念を作成するには、多くのオプションがあります。個人的に、私はmetatableを作成するというアイデアが好きで、programmatically merging the fields on the metatablesから「派生」したいと思います。次に、この新しいマージされたメタオブジェクトを使用して、新しいオブジェクトでメタオブジェクトを設定できます。
behavior_derived = {myNewFunction = function() return 20 end}
-- merge the base behavior in with our derived behavior
for k,v in pairs(behavior) do behavior_derived[k] = v end
a_derived = {}
b_derived = {}
setmetatable(a_derived, behavior_derived)
setmetatable(b_derived, behavior_derived)
a_derived.myfunction() --> 10
a_derived.myNewFunction() --> 20
b_derived.myfunction() --> 10
b_derived.myNewFunction() --> 20
これは、私が考えることができる他のものから "クラス"を派生させるのに最も近いものです。
Luaには「継承」または「クラス」がありません。しかし、それをLuaでエミュレートすることは可能です。少しの追加作業で、Luaテーブルをクラスとして扱うことができます。 –
それに貼り付けるラベルについて心配する必要はありません。メタテーブルの仕組みの実際の仕組みを学ぶだけです。 1つのラベルや他のラベルを貼ることはあなたを助けるつもりはありません。 – user2357112