本文介绍: 面向对象是基于table实现的。

面向对象是基于table实现

封装

:(冒号) 自动将调用该函数对象作为第一个参数传入

--Object就是第一参数
function Object:new()

self:代表默认传入的第一个参数

_index:当自己的变量中找不到时,会默认找原表中_index指向的内容

Object = {}
Object.id = 1

function Object:new()
    local obj = {}
    --找不到变量时,默认找Object中的变量
    self._index = self
    --设置原表为Object
    setmetatable(obj,self)
    return obj
end
local myObj = Object:new()
print(myObj.id)

继承

_G总表:所有声明的全局变量,都以键值对的形式存在在其中

思路:

1.继承的对象声明一张_G表

2.将其设置为父对象的子表

function Object:subClass(className)
    _G[className] = {}
    local obj = _G[className]
    self._index = self
    setmetatable(obj,self)
end

Object:subClass("Person")
local p1 = Person:new()
print(p1.id)

多态

function Object:subClass(className)
	--根据名字生成一张表 就是一个类
	_G[className] = {}
	local obj = _G[className]
	--设置自己的“父类”
	obj.base = self
	--给子类设置元表 以及 __index
	self.__index = self
	setmetatable(obj, self)
end

--申明一个新的类
Object:subClass("GameObject")
--成员变量
GameObject.posX = 0
GameObject.posY = 0
--成员方法
function GameObject:Move()
	self.posX = self.posX + 1
	self.posY = self.posY + 1
end

--实例对象使用
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 继承 GameObject
GameObject:subClass("Player")
--多态 重写了 GameObject的Move方法
function Player:Move()
	--base调用父类方法 用.自己传第一个参数
	self.base.Move(self)
end
print("****")
--实例化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)

原文地址:https://blog.csdn.net/Theolulu/article/details/134593663

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_1297.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注