メタテーブルがどのように機能するのか、そしてクラスの作成と継承のためにメタテーブルがLuaで必要な理由を理解するのに苦労しています。Luaで見つけたすべてのOOPの例は、前回とは少し異なりますが、特に__index
プロパティに対しては常にメタテーブルを使用します。これが私がいくつかの単純な継承を実装した方法です:
Animal = {}
function Animal.New()
local self = {}
self.sName = "Generic Animal"
self.GetName = function(self)
return self.sName
end
self.Speak = function(self)
-- Do nothing, abstract function
end
return self
end
Dog = {}
function Dog.New()
local self = Animal.New()
self.sName = "Dog"
self.Speak = function(self)
print("Bark!")
end
return self
end
Labrador = {}
function Labrador.New()
local self = Dog.New()
self.sName = "Labrador"
return self
end
Chihuahua = {}
function Chihuahua.New()
local self = Dog.New()
self.sName = "Chihuahua"
self.Speak = function(self)
print("Yap yap!")
end
return self
end
-- Test --
l = Labrador.New()
print(l:GetName())
l:Speak()
c = Chihuahua.New()
print(c:GetName())
c:Speak()
d = Dog.New()
print(d:GetName())
d:Speak()
a = Animal.New()
print(a:GetName())
a:Speak()
出力:
Labrador
Bark!
Chihuahua
Yap yap!
Dog
Bark!
Generic Animal
私が見る限り、これは問題なく機能します。メタテーブルを使用すると、デザインがどのように改善されますか?