封装
-- 面向对象 类 其实都是基于 table来实现
-- 元表相关的知识点
Object = {}
Object.id=12
function Object:Test()
print(self.id)
end
-- 冒号 是会自动将调用这个函数的对象 作为第一个参数传入的写法
-- 在Object 表添加 new 成员方法
function Object:new()
--self 代表的是 我们默认传入的第一个参数
--对象就是变量 返回一个新的变量
--返回出去的内容 本质上就是表对象
local obj={}
-- 元表知识 __index 当找自己的变量 找不到时 就会去找元表当中__index指向的内容
self.__index=self
setmetatable(obj,self)
return obj
end
local myObj = Object:new();
print(myObj)
myObj.id=3
-- 输出 3
print(myObj.id)
myObj:Test()
--输出12
print(Object.id)
--输出 12
print(getmetatable(myObj).id)
继承
--C# clase 类名 : 继承类
-- 写一个用于继承的方法
function Object:subClass(className)
--body
_G[className] ={}
-- 写相关继承的规则
-- 用到元表
local obj=_G[className]
self.__index=self;
--子类定义一个base 属性代表父类
obj.base=self;
setmetatable(obj,self)
end
--print(_G)
--_G["a"]=1
--_G.b="洛溪"
--print(a)
--print(b)
Object:subClass("Person")
print(Object.id)
-- 上面继承用到的方法
local p1=Person:new()
p1.id=3
print(p1.id)
Object:subClass("Monster")
local m1=Monster:new()
m1.id=6
print(m1.id)
多态
--C# clase 类名 : 继承类
-- 写一个用于继承的方法
function Object:subClass(className)
--body
_G[className] ={}
-- 写相关继承的规则
-- 用到元表
local obj=_G[className]
self.__index=self;
--子类定义一个base 属性代表父类
obj.base=self;
setmetatable(obj,self)
end
--print(_G)
--_G["a"]=1
--_G.b="洛溪"
--print(a)
--print(b)
Object:subClass("Person")
print(Object.id)
local p1=Person:new()
p1.id=3
print(p1.id)
Object:subClass("Monster")
local m1=Monster:new()
m1.id=6
print(m1.id)
print("***********面向对象——多态************")
-- 相同行为 不同表象 就是多态
-- 形同方法 不同执行逻辑 就是多态
Object:subClass("GameObject")
GameObject.posX=0;
GameObject.posY=0;
function GameObject:Move()
self.posX=self.posX+1
self.posY=self.posY+1
print(self.posX,self.posY)
end
GameObject:subClass("Player")
function Player:Move()
--base 指的是 GameObject 表(类)
-- 这种方式调用 相当于是把基类表 作为第一个参数传入了方法中
--避免把基类表 传入到方法中 这样相当于就是公用一张表的属性了
-- 我们如果要执行父类逻辑 我们不要直接使用冒号调用
-- 要通过点. 调用 然后把直接传入第一个参数
self.base.Move(self)
-- body
-- 多态目前这种写法 有坑 不同的对象使用的成员变量 居然时同样的成员变量
-- 不是自己的 所有不要用下面的写法在重写方法里
--self.base:Move()
end
local p1 = Player:new();
p1:Move();
local p2=Player:new();
p2:Move()
Player:Move()
Player:Move()
标签:面向对象,--,self,Object,语法,Lua,print,local,id
From: https://www.cnblogs.com/Luo-Xi/p/18328889