Lua语法详解之多态

--面向对象实现
--万物之父 所有对象的基类 object
Object={}
--实例化方法
function Object:new()
	local obj={}
	--给空对象设置元表,以及__index
	self.__index=self
	setmetatable(obj,self)
	return obj
end
--继承
function Object:subClass(className)
	--根据名字生成一张表,就是一个类
	_G[className]={}
	local obj=_G[className]
	--给子类一个属性base,方便找其父类
	obj.base=self
	--给子类设置元表以及__index
	self.__index=self
	setmetatable(obj,self)
end

--测试
--生成一个GameObject类为Object子类,而且还有两个属性posx,posy,和一个成员方法
Object:subClass("GameObject")
GameObject.posX=0;
GameObject.posY=0;
function GameObject:Move()
	self.posX=self.posX+1
	self.posY=self.posY+1
end

--实例化GameObject
local obj=GameObject:new()
print(obj.posX)--0
obj:Move()
print(obj.posX)--1

--展现多态
--重新定义个Player类,里面也有move方法
GameObject:subClass("Player")
function Player:Move()
	self.base.Move(self)
	--注意,这里如果写成了self.base:Move(),实际上是调用GameObject的move方法,把基类表作为了第一个参数,而且,这
	--这个产生的p1,p2,p3这种对象是对move()的操作实际上操作的是同一个posx,posy
	--这样有违面向对象的原则,也即每调用一次move都要加1
	--用self.base.Move(self),实际传入的是player,但是player里面没有posx,posy,所以,要去找gameobject表,找到了之后,因为self.posX=self.posX+1,实际上赋值的时候是给player又添加了posx,posy这两个属性,所以,player此时已经又了自己的posx,posy了,所以后面即使多来几个p2,p3,实际都是它们自己的posx,posy,不会相互影响了。
end
local p1=Player:new()
print(p1.posX)---0
p1:Move()
print(p1.posX)---1








你可能感兴趣的:(Lua相关,lua,unity3d,游戏开发)