文章目录
前言
37校招笔试考过“lua怎么实现继承”,当时人傻了,现在补习回来吧。
学习资料:【唐老狮】Unity热更新之Lua语法
1 类封装,继承,多态
前提要认识__index
关键字,如果表的元表有该关键字,会把该表的访问重定向到__index
关键字所指定的表,一般在lua类中指向回元表,来继承属性(表数据)。
-- Object.lua
Object = {
id = 1
}
-- 类比C#实现new功能
-- 变量名:函数名,意思是传入变量为函数的第一个参数self
function Object:new()
local obj = {}
-- 为了继承父类属性,实例没有该属性时会一个个父类往上找
-- 并且多个实例,属性不互相影响
self.__index = self
-- 设置实例元表为self,即函数的第一个参数
setmetatable(obj, self)
return obj
end
-- 实现继承, lua里表会继承元表的方法
function Object:subclass(className)
-- 实现base.方法名
self.base = self
-- 实现继承,self为父类
_G[className] = self:new()
end
return Object
-- GameObject.lua
local Object = require("Object1")
print("*******************继承*****************")
Object:subclass("Dog")
local d1 = Dog:new()
print(d1.id) -- 1
d1.id = 100
print(d1.id) -- 100
Object:subclass("Cat")
local c1 = Dog:new()
print(c1.id)
c1.id = 200 -- 1
print(c1.id) -- 200
print("*******************多态*****************")
Object:subclass("GameObject")
GameObject.posX = 0
GameObject.posY = 0
print(GameObject.base)
function GameObject:Move()
self.posY = self.posY + 1
self.posX = self.posX + 1
print(self.posX, self.posY)
end
GameObject:subclass("Player")
function Player:Move()
-- 【坑】 调用父类方法要传入自己
-- 用:则默认传入GameObject,属性(表)数据共享
-- Player直接找父类base,base即父类GameObject
self.base.Move(self)
end
p1 = Player:new()
p1:Move() -- 1 1
p2 = Player:new()
p2:Move() -- 1 1
p1:Move() -- 2 2
总结
啥时候puerts可以代替xlua。