lua优雅的实现继承,栈队列实例

  • 实现方式来源网络
function class(base, _ctor)
    local c = {}    -- a new class instance
    if not _ctor and type(base) == 'function' then
        _ctor = base
        base = nil
    elseif type(base) == 'table' then
    -- our new class is a shallow copy of the base class!
    -- 只能继承全局变量,local变量需要转换为类方法来继承
        for i,v in pairs(base) do
            c[i] = v
            print(i,v)
        end
        -- c.__index = base
        c._base = base
    end

    -- the class will be the metatable for all its objects,
    -- and they will look up their methods in it.
    c.__index = c

    -- expose a constructor which can be called by <classname>(<args>)
    local mt = {}

    mt.__call = function(class_tbl, ...)
        local obj = {}
        setmetatable(obj,c)
        -- 调用call的时候调用构造函数
        if _ctor then
            _ctor(obj,...)
        end
        return obj
    end

    c._ctor = _ctor
    c.is_a = function(self, klass)
        local m = getmetatable(self)
        while m do
            if m == klass then return true end
            m = m._base
        end
        return false
    end
    setmetatable(c, mt)
    return c
end
  • 基本使用
require("object")

Animal = class(function( self,name )
    -- 需要继承的全局变量需要写到这里,在子类调用_ctor方法的时候,加入到子类的table
    self.name = name
    self.s = {}
end)


function Animal:add(key,value)
    -- body
    self.s[key]=value
end
function Animal:get(key)
    -- body
    return self.s[key]
end
-- 执行完这段代码后 Animal中所有数据都已经拷贝到Cat中,Animal改变不会引发Cat改变
-- 如果源码中不是拷贝Animal中数据到Cat中,Animal发生变化。Cat将会跟随着一直发生变化
Cat = class(Animal,function( self,name )
    -- body
    Animal._ctor(self,name) --继承父类构造方法(这里是调用Animal._ctor方法,参数是Cat,name)

end)


cat = Cat("cat") --实例化会调用_ctor构造函数
cat:add("x","cat")
cat2 = Cat("cat2")
cat2:add("x","cat2")


print(cat:get("x"))
image.png
  • 队列
require("class")
Queue = class(function(self,capacity)
    -- body
    self.capacity = capacity
    self.queue = {}
    self.size = 0
    self.head = -1
    self.rear = -1
end)

function Queue:enQueue(element)
    if not element then return end
    if self.size == 0 then
        self.head = 0
        self.rear = 0
    end
    if self.capacity then
        if self.size >= self.capacity then
            print("队列已满")
            return 
        end
        self.rear = (self.rear) % self.capacity + 1
    else
        self.rear = self.rear + 1
    end
    self.queue[self.rear] = element
    self.size = self.size + 1
end


function Queue:deQueue()
    if self.size == 0 then
        print("队列为空")
        return nil
    end
    if self.capacity then
        self.head = (self.head) % self.capacity + 1
    else
        self.head = self.head + 1
    end
    self.size = self.size - 1
    return self.queue[self.head]
end
require("class")
Stack = class(function(self)
    self.stack = {}
end)

function Stack:push(element)
    if not element then return end
    table.insert(self.stack,element)
end

function Stack:pop()
    local len = #self.stack
    if len == 0 then
        print("空栈")
        return nil
    end
    local value = self.stack[len]
    self.stack[len] = nil
    return value
end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342