面向对象
1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
封装
通过每次返回一个局部创建的空表并设置对的元表以及元表的__index 实现
-- Lua 封装
Student ={
}
Student.age = 0
Student.name = ""
function Student:Speak()
print("我叫"..self.name.."\t年龄"..self.age)
end
function Student:new()
-- 局部变量 --> 每次调用都创建一个新的 obj
local obj = {
}
-- __index: 当找不到对应属性时 找元表设置的__index所指向的表
self.__index = self
-- 将obj的元表设定为Student
setmetatable(obj,self)
return obj
end
stu1 = Student:new()
stu1.age = 13
stu1.name ="小明"
stu1:Speak()
stu2 = Student:new()
stu2.age = 3
stu2.name ="小红"
stu2:Speak()
输出
继承
通过_G[键]表来建立对应的表以及对表进行封装来实现继承
Student = {
}
Student.age = 0
Student.name = "XX"
-- Lua 封装
function Student:new()
local obj = {
}
self.__index = self
setmetatable(obj, self)
return obj
end
-- Lua 继承
function Student:subClass(className)
-- 通过_G表来建立对应的表
_G[className] = {
}
local obj = _G[className]
self.__index = self
setmetatable(obj, self)
end
Student:subClass("pupil")
print(pupil.name)
local pu1 = pupil:new()
print(pu1.name) --> "XX"
输出结果
多态
通过自定义 base 属性指向父类来实现继承父类方法和属性 以实现多态
Obeject = {
}
-- Lua 封装
function Obeject:new()
local obj = {
}
self.__index = self
setmetatable(obj, self)
return obj
end
-- Lua 继承
function Obeject:subClass(className)
_G[className] = {
}
local obj = _G[className]
self.__index = self
-- 多态需要在继承这里添加一个自定义的base,来获取父类
self.base = self
setmetatable(obj, self)
end
-- 多态实现 Player 继承于 GameObejct 并重写 SayHello()
Obeject:subClass("GameObject")
GameObject.num = 0
function GameObject:SayHello()
self.num = self.num + 1
print("hello" .. self.num)
end
GameObject:subClass("Player")
function Player:SayHello()
self.base.SayHello(self) -- > 继承并使用父类的方法
-- 错误写法
-- self.base:SayHello()
end
local G1 = GameObject:new()
G1:SayHello()
G1:SayHello()
G1:SayHello()
local P1 = Player:new()
P1:SayHello()
P1:SayHello()
输出结果