Lua実装オブジェクト向け
2550 ワード
: ,
C#ではthisで現在のクラスのオブジェクトを表し、Luaではself点(.)を用いるコロン(:)との違い:前者はselfパラメータを手動で呼び出す必要があり、後者はselfパラメータを隠すtableによるオブジェクト向けの実装:
Person = { -- person
name = "",
age = 0
}
function Person.Setvalue(self, _name, _age) --
self.name = _name
self.age = _age
end
function Person.Getvalue(self) --
return self.name, self.age
end
local p1 = Person --
p1.Setvalue(p1, " ", 18)
local n, a = p1.Getvalue(p1)
local p2 = Person --
p2.Setvalue(p2, " ", 22)
local nn, aa = p2.Getvalue(p2)
print(nn .. '\t' .. aa)
print(n .. '\t' .. a)
コロン(:)形式の使用:
Person = { -- person
name = "",
age = 0
}
function Person:Setvalue(_name, _age) --
self.name = _name
self.age = _age
end
function Person:Getvalue() --
return self.name, self.age
end
local p1 = Person --
p1:Setvalue(" ", 18)
local n, a = p1:Getvalue()
local p2 = Person
p2:Setvalue(" ", 22)
local nn, aa = p2:Getvalue()
print(nn .. '\t' .. aa)
print(n .. '\t' .. a)
説明:ここでオブジェクトの作成とは、親テーブルを直接呼び出し、複数のオブジェクトを作成することも同じ場所を指し、1つのオブジェクトデータが変化して他のオブジェクトも変化します.したがって、このようなオブジェクト向けには、1つのオブジェクトを作成してもよいし、複数のオブジェクトを作成しても適用されません.
継承の実装:
利用_indexインプリメンテーション継承:サブクラステーブルのメタテーブルと_indexメソッドはすべて親自身に設定されており、子にないものは自動的に検索されます_indexテーブル(親テーブル)は、親テーブルに相当するものが子テーブルに継承されます.
----------- ----------------
Person = {
name = "",
age = 18,
gender = ""
}
function Person:New(tab)
tab = tab or {}
setmetatable(tab, self)
self.__index = self
return tab
end
function Person:Eat()
print(self.name .. " ")
end
function Person:Init(name, age, gender)
self.name = name
self.age = age
self.gender = gender
end
function Person:GetInfo()
return self.name, self.age, self.gender
end
-------------- ----------------
Chinese = Person:New({height = 180, looklike = " "})
Chinese:Init(" ", 5000, " ")
Chinese:Eat()
American = Person:New({})
American:Init(" ", 1000, " ")
American:Eat()
function American:Sing()
print(self.name .. " ")
end
American:Sing()
print(Chinese:GetInfo())
print(American:GetInfo())
5000
1000
説明:1、サブクラスには単独のテーブルがあり、1つのサブクラステーブルのデータの変化は他のサブクラスの変化に影響しない.2、直接インスタンス化した子クラスオブジェクトに相当し、親クラステーブルの変数とメソッドを呼び出すことができ、同時に自身も新しい変数とメソッドを定義することができる.