Lua中模拟C#中的面向对象

为了更好的在lua中开发模块,我们可以把其他语言中的面向对象拿过来使用。

1.模拟C#中的类


----------------------------------------------------------------------
--- 类相关
----------------------------------------------------------------------
local function _ctor(...)
    return
end

--[[
  实例化一个obj对象,作为cls的实例,同时调用obj对象的ctor方法用于初始化对象
]]--
local function _new(cls, ...)
    local obj = {}
    --将这个表设置元表
    setmetatable(obj, {__index = cls})
    --初始化构造函数
    obj:ctor(...)
    return obj
end

local function _tostr(cls)
    return cls.__printName
end

--[[ 构造一个类。
(string)类名称
(class)基类
使用class方法构造表后,直接调用New方法和使用表明()这两种方法是等价的,都是为了触发_new方法
]]--
function class(name, base)

    local cls = {}
    --给表里存字段,模拟类
    --类名
    cls.__cname = name
    --输出类名
    cls.__printName = "class " .. name
    --类的构造函数
    cls.New = _new
    --元表的属性,模拟继承,先去自身找,找不到去父类base里面找
    local mt = {
        __index = base,
        __call = _new,
        __tostring = _tostr,
    }
    --设置继承关系
    setmetatable(cls, mt)
    --构造
    if cls.ctor == nil then
        cls.ctor = _ctor
    end
    return cls
end
2.模拟C#中的接口

–[[
让类t拥有接口的功能,模拟多继承。
改方法用于将接口中的方法都拷贝到当前类中。
]]–
function implement(t, …)
for _, tmp in ipairs({…}) do
for k, v in pairs(tmp) do
if t[k] ~= nil then
print(format(“WARN: the method ‘%s’ will be covered”, k))
end
t[k] = v
end
end
end

3.模拟C#中的枚举

–协议类型–
ProtocalType = {
BINARY = 0,
PB_LUA = 1,
PBC = 2,
SPROTO = 3,
}


4.模拟C#中的单例
local PlayerManager = class("PlayerManager")

local playerDic = {}

local Instance = nil

function PlayerManager:ctor()

end

function PlayerManager:GetInstance()
   if Instance == nil then 
      Instance = PlayerManager()
    end
    return Instance
end

--添加的话根据角色物体添加
function PlayerManager:AddPlayer(player)
  playerDic[player.name]=player
  --写入到一个文件中记录一下,方便以后的查找移除
end

--移除的话根据角色名字移除
function PlayerManager:RemovePlayer(playerName)
  for name,player in pairs(playerDic) do
       if playerName == name then 
       playerDic[name] = nil
       name = nil
       end
  end 
end

function PlayerManager:GetPlayerGameObject(playerName)
  for name,player in pairs(playerDic) do 
     if playerName == name then 
     return playerDic[name]
     end
  end
end


return PlayerManager

4.调用单例

function PlayerController:CreatePlayer()
  print(self.playerPath)
    if self.playerPath ~= nil then
       local go = Resources.Load(self.playerPath)
       print(go.name)
       self.player = GameObject.Instantiate(go)
       print(self.player.name)
       self.player.transform.position = Vector3.New(0,0,0)
       --实例化的时候添加到角色管理器中,方便在其他地方拿到角色这个游戏物体
       PlayerManager:GetInstance():AddPlayer(self.player)
    end
end
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值