面向对象是基于table实现的
封装
:(冒号) 自动将调用该函数的对象作为第一个参数传入
--Object就是第一参数function Object:new()
self:代表默认传入的第一个参数
_index:当自己的变量中找不到时,会默认找原表中_index指向的内容
Object = {}Object.id = 1function Object:new()local obj = {}--找不到变量时,默认找Object中的变量self._index = self--设置原表为Objectsetmetatable(obj,self)return objendlocal myObj = Object:new()print(myObj.id)
继承
_G总表:所有声明的全局变量,都以键值对的形式存在在其中
思路:
1.继承的对象声明一张_G表
2.将其设置为父对象的子表
function Object:subClass(className)_G[className] = {}local obj = _G[className]self._index = selfsetmetatable(obj,self)endObject:subClass("Person")local p1 = Person:new()print(p1.id)
多态
function Object:subClass(className)--根据名字生成一张表 就是一个类_G[className] = {}local obj = _G[className]--设置自己的“父类”obj.base = self--给子类设置元表 以及 __indexself.__index = selfsetmetatable(obj, self)end--申明一个新的类Object:subClass("GameObject")--成员变量GameObject.posX = 0GameObject.posY = 0--成员方法function GameObject:Move()self.posX = self.posX + 1self.posY = self.posY + 1end--实例化对象使用local obj = GameObject:new()print(obj.posX)obj:Move()print(obj.posX)local obj2 = GameObject:new()print(obj2.posX)obj2:Move()print(obj2.posX)--申明一个新的类 Player 继承 GameObjectGameObject:subClass("Player")--多态 重写了 GameObject的Move方法function Player:Move()--base调用父类方法 用.自己传第一个参数self.base.Move(self)endprint("****")--实例化Player对象local p1 = Player:new()print(p1.posX)p1:Move()print(p1.posX)local p2 = Player:new()print(p2.posX)p2:Move()print(p2.posX)