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、直接インスタンス化した子クラスオブジェクトに相当し、親クラステーブルの変数とメソッドを呼び出すことができ、同時に自身も新しい変数とメソッドを定義することができる.