Lua 继承 多态 单利模式 面向对象

31 篇文章 0 订阅
26 篇文章 2 订阅

lua模拟面向对象编程中得继承、多态,这里也同时演示设计模式中得单利模式,类的实现都是通过lua中table,这个table太强大了,又可以当集合、数组


继承

基类 class222.lua

--声明,这里声明了类名还有属性,并且给出了属性的初始值。
class2 = {}
class2.a = "class2 aaa"
class2.b = "class2 bbb"
class2.c = "class2 ccc"
--这句是重定义元表的索引,就是说有了这句,这个才是一个类。具体的解释,请百度。
class2.__index = class2

--新建一个实例对象并返回
function class2:new(data)
    local self = {}   --初始化self,如果没有这句,那么类所建立的对象改变,其他对象都会改变
    setmetatable(self , class2) --将self的元表设定为Class
    self.a = data   --属性值初始化
    return self --返回自身
end

--这里定义类的其他方法
function class2:func2()
    print("class2 : func2")
end

function class2:test()
    print("class2 : test")
    return "asdsd"
end

function class2:ooo()
    return 432
end

function class2:ppp()
	return 100
end

function class2:qqq()
	return self:ppp() * 2
end


子类class111.lua

require "class2"    --因为继承class2,所以这里一定要包含class2文件,否则报找不到方法的错
-声明类和属性
class1 = {}
class1.u = "class1 uuu"
class1.i = "class1 iii"

--设置类型是class2
setmetatable(class1, class2)
--还是和类定义一样,表索引设定为自身
class1.__index = class1

--新建一个实例对象并返回
function class1:new(data,xxx)
    local self = {}
    self = class2:new(data)
    setmetatable(self,class1)
    self.u = xxx
    return self
end

-- 添加新的方法
function class1:func1()
    print("class1 : func1")
end

-- 重写父类中得ooo方法
function class1:ooo()
    return 999
end

function class1:ppp()
	return 22
end

test

local a = class2:new("init data aaa")
            a:func2()
            print(a.a)
                
            local b = class1:new("www","xxx啊")
            b:func1()
            print(b.a)
            print(b.u)
            b:func2()
            
            local n = b:test()
           print(n)
           
        local m = b:ooo()
--        node:addChild(m)
        print(m)
           
         local h = class2:new("hhh")
         print(h:qqq())
         
         local j = class1:new("jjj","jjjnew")
         print(j:qqq())
         print(h:qqq())


结果:




多态

local h = class2:new("hhh")
         print(h:qqq())
         
         local j = class1:new("jjj","jjjnew")
         print(j:qqq())
         print(h:qqq())

class1中重写了ppp方法,返回另一个值,调用父类class2中继承下来的qqq方法时,qqq方法中的self:ppp()中的self指的是class1,这就实现的多态的行为


结果


单例模式

class3.lua

CatManager = {}  --新建一个类
CatManager.num = 1  --定义num属性并付志伟
CatManager.__index = CatManager --定义元表的索引,使之成为一个类

function CatManager:new()
    local self = {} --新建一个实例对象
    setmetatable(self,CatManager)   --设置实例类型为CatManager
    return self --返回实例对象
end

function CatManager:getInstance()
    if self.instance == nil then    
    	self.instance = self:new()
    end
    return self.instance
end

function CatManager:func1()
    print("catManager func1")
end

test

local cat1 = CatManager:getInstance()
         print(cat1.num)
         cat1.num = cat1.num + 10
         
         local cat2 = CatManager:getInstance()
         print(cat2.num)
         
         if cat1 == cat2 then
         	print("cat1和cat2两个是同一个对象")
         end

[LUA-print] 1

[LUA-print] 11

[LUA-print] cat1和cat2两个是同一个对象


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶泳奈何桥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值