本文共 3680 字,大约阅读时间需要 12 分钟。
01:定义一个类--定义一个类person={name="唐孝辉",age=26}person.eat=function (self)print(self.name.."今年"..self.age.."岁了")endperson.eat(person)--唐孝辉今年26岁了
--定义一个类person={name="唐孝辉",age=26}function person:eat()print(self.name.."今年"..self.age.."岁了")endperson:eat()--唐孝辉今年26岁了
02:
创建构造函数,以用于构造拥有相同属性和函数的对象--创建新的类--通过newfunction person:new()t={}setmetatable(t,{__index=self})return tendperson1=person:new()person1:eat()person1.name="2522"person1:eat()--匿名函数person.sum=function()print(8845)endperson.sum()--唐老鸭今年100--唐老鸭今年100--2522今年100
03:继承
-继承student=person:new(nil)student.grade=200student:eat()print(student.name)
person={age,name,address="中国"}function person:show()print(self.age,self.name,self.address)endperson:show()--面向对象function person:new()obj={}setmetatable(obj,person)person.__index=personreturn objendnewPerson=person:new()newPerson.name="遇到的"newPerson.age=200newPerson:show()
04:类中的成员
Hero={name,hp,mp,attack} --创建表function Hero:attack1()print("攻击方法1")endfunction Hero:attack2()print("攻击方法2")endfunction Hero:toString()str=string.format("名字:%s 生命值:%s 魔法值:%s 攻击力:%s",self.name,self.hp,self.mp,self.attack);print(str)end--面向对象function Hero:new()obj={}setmetatable(obj,Hero)self.__index=selfreturn objendsum=Hero:new()sum.name="好的"sum.hp=100sum.mp=500sum.attack=888sum:attack1() --攻击方法1sum:attack2() --攻击方法2sum:toString() --名字:好的 生命值:100 魔法值:500 攻击力:888
另一种面向对象
local _class={ }function class(super) local class_type={ } class_type.ctor=false class_type.super=super class_type.new=function(...) local obj={ } do local create create = function(c,...) if c.super then create(c.super,...) end if c.ctor then c.ctor(obj,...) end end create(class_type,...) end setmetatable(obj,{ __index=_class[class_type] }) return obj end local vtbl={ } _class[class_type]=vtbl setmetatable(class_type,{ __newindex= function(t,k,v) vtbl[k]=v end }) if super then setmetatable(vtbl,{ __index= function(t,k) local ret=_class[super][k] vtbl[k]=ret return ret end }) end return class_typeendbase_type=class() -- 定义一个基类 base_typefunction base_type:ctor(x) -- 定义 base_type 的构造函数 print("base_type ctor") self.x=xendfunction base_type:print_x() -- 定义一个成员函数 base_type:print_x print(self.x)endfunction base_type:hello() -- 定义另一个成员函数 base_type:hello print("hello base_type")endtest=class(base_type) -- 定义一个类 test 继承于 base_typefunction test:ctor() -- 定义 test 的构造函数 print("test ctor")endfunction test:hello() -- 重载 base_type:hello 为 test:hello print("hello test")enda=test.new(1) -- 输出两行,base_type ctor 和 test ctor 。这个对象被正确的构造了。a:print_x() -- 输出 1 ,这个是基类 base_type 中的成员函数。a:hello() -- 输出 hello test ,这个函数被重载了
05.—index是一个函数的时候
local RoleCache = { }RoleCache.name="角色缓存";return RoleCache;
local Cache = { };Cache.name="基类缓存";local filePaths = { role = "RoleCache"; --角色缓存 }local mt = { };--当cache调用了不存在的role字段时--就会调用table元表里的__index元方法--并且会传递table和字段名两个参数mt.__index = function (t, key) if filePaths[key] then t[key] = require(filePaths[key]); print("表的名字:"..t.name); print( t[key].name) else return nil; end return t[key]; --返回的是Cache中查找的表endsetmetatable(Cache, mt)return Cache;
local cache =require("Cache");local role=cache.role;--print(role.name)
表的名字:基类缓存
角色缓存转载地址:http://vnrxo.baihongyu.com/