print("=================面向对象=================")
Student = {
age = 1,
sex = true,
Up = function ()
print(Student.age)
print("Growing up")
end,
Learn = function()
print("好好学习")
end
}
Student.name = "guan"
function Student:Speak2()
print(self.name .. " Speak")
end
-- Lua中.和冒号的区别
-- 冒号的方法第一个参数默认传入self表示当前实例
Student:Speak2()
print("=================封装=================")
Object = {}
Object.id = 1
function Object:Test()
print(self.id)
end
function Object:new()
-- 对象就是变量 返回一个新的变量
-- 返回出去的内容 本质上就是表对象
local obj = {}
self.__index = self
setmetatable(obj, self)
-- index当找自己的变量,找不到是 就时去元表中找__index指向的内容
return obj
end
print("=================继承=================")
function Object:subClass(className)
-- _G声明全局标量,以键值对的形式
_G[className] = {}
-- 继承规则
local obj = _G[className]
self.__index = self
obj.base = self
setmetatable(obj, self)
end
Object:subClass("Person")
local p1 = Person:new()
p1.id = 100
print(p1:Test())
Object:subClass("Monster")
local m1 = Monster:new()
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)
print(self.posY)
end
GameObject:subClass("Player")
-- 重写Move()方法
function Player:Move()
-- base.Move() C#写法
-- 添加Obj.base = self 在父类中
-- self指的是Gameobject
-- 避免把基类表传入到方法中
-- 谁调用,self就是指谁
self.base.Move(self) -- 执行GameObject:Move()
end
local p1 = Player:new()
p1:Move()
local p2 = Player:new()
p2:Move()