Lua进阶学习:面向对象

面向对象

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"

输出结果
XX
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()

输出结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wa36d/article/details/127380390