print("封装__")
Object = {}
Object.ID = 1
function Object:Text()--":"自动传入调用这个函数的对象,作为第一个参数传入方法
print(self.ID)--“self”代表默认传入的第一个参数
end

function Object:new( )--类用于创建对象的方法--构造函数
--function Object:new(o)--充当构造函数,返回空表,将本身设为空表的原表来继承类的属性与函数
--local obj= o or {}--o填写时在填入子类的属性/函数基础上创建对象,不填时为空继承父类默认所有属性/函数创建对象()p1 = Object:new(weight = 100) 或 p1 = Object:new()
local obj = {}
--原表的__index指向自身
self.__index =self--__index:当在自己的表中找不到目标属性时,就会在元表的__index中寻找
setmetatable(obj ,self)
--setmetatable (obj,{__index=self})--与上两句作用相同
return obj
end

local myObj = Object:new()
print(myObj)
print(myObj.ID)
myObj:Text()--myObj调用则传入myObj

print("_继承")

--构造用于继承的方法
function Object:subClass(className)--声明类的方法
--_G表存储所有的全局变量
_G[className] = {}
local obj = _G[className]
self.__index = self
--为子类定义一个父类属性base
obj.base = self
setmetatable(obj,self)
end

Object:subClass("Person")
--print(Person)--此时是通过类名访问属性,类似静态变量
--Person:Text()
--通过对象访问属性
local p1 = Person:new ()--Person继承自Object的new方法。self使Person为第一变量传入
p1:Text()--原表中不存在,会继续查找原表的原表

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.posX)

end

GameObject:subClass("Player")--声明角色类

function Player:Move()--与父类方法“重名"即相当于重写方法
--此时base指GameObject类,使用“:”调用相当于把基类作为第一参数传入方法中,则此时创建pl2时会输出2,2
--self.base:Move()
--因此为了避免把基类表传入方法中,不使用“:”调用
self.base.Move(self)--使用.进行调用自行填入第一个传入的参数
print("子类重写")
end

local pl1 = Player:new()--角色类对象
pl1:Move()

local pl2 = Player:new()
pl2:Move()