Lua学习--------封装继承多态

在这里插入代码片print("************面向对象************")
print("************封装************")
--面向对象 类 其实都是基于 table来实现的
--元表相关的知识点
Object = {}
Object.id = 1

function Object:Test()
	print(self.id)
end

--冒号 是会自动将调用这个函数的对象 作为第一个参数传入的写法
function Object:new()
	--self 代表的是 我们默认传入的第一个参数

	--对象就是变量 返回一个新的变量
	--放回出去的内容 本质上就是表对象
	local obj = {}

	--元表知识 __index 当找自己的变量 找不到时 就会去找元表当中 __index指向的内容
	self.__index = self
	setmetatable(obj ,self)
	return obj
end

local myObj = Object:new()
print(myObj.id)

myObj:Test()
--对空表中国 申明一个新的属性 叫做ID
myObj.id = 2
print(Object.id)
myObj:Test()


print("************继承************")

--C# 中 class 类名:继承类
--写一个用于继承的方法

function Object:subClass(classname)
	--_G知识点 是总表 所有申明的全局变量 都以键值对的形式存在其中
	_G[classname] = {}
	--写相关继承的规则
	--用到元表

	local obj = _G[classname]
	self.__index = self
	--子类 定义一个base属性 base属性代表父类
	obj.base = self 
	setmetatable(obj,self)
end

--_G["a"] = 1
--print(a)

Object:subClass("Person")
print(Person)
print(Person.id)

local p1 = Person:new()
Person.id = 100
print(p1.id)
p1:Test()

Object:subClass("Monster")
local m1 = Monster:new()
Monster.id = 200
print(m1.id)
m1:Test()

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.."-"..self.posY)
end

GameObject:subClass("Player")

function Player:Move()
	--base.Move()调用父类方法
	--self.base指的是 GameObject 表(类)
	--这种方式调用 相当于把基类表 作为第一个参数传入了方法
	--避免把积累表 传入到方法中 这样相当于就是公用一张表的属性了
	--我们如果要执行父类逻辑 我们不要直接使用冒号调用
	--要通过.调用 然后自己传入第一个参数
	
	self.base.Move(self)
end

local p1 = Player:new()
p1:Move()
--目前这个写法有问题 不同对象使用的成员变量 竟然是相同的成员变量
local p2 = Player:new()
p2:Move()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值