zoukankan      html  css  js  c++  java
  • Lua面向对象之三:其它一些尝试

    1.尝试一:子类对象调用被覆盖了的父类函数

    根据元表设置流程,我们只有将父类元表找到就能调用父类的方法了

    ①在子类Circle中增加一个调用父类方法的函数

    --调用父类被子类覆盖了的name方法
    function Circle:sharp_name()
        local circle_metatable = getmetatable(self)
        local sharp_metatable = getmetatable(circle_metatable)
        sharp_metatable["name"]()
    end

    ②调用结果(完全正确)

     

    2.尝试二:不使用全局表作为元表

    ①在上两篇中,使用全局表作为元表:

    下图是父类以Sharp作为元表

    下图是子类以Circle作为元表

     

    ②修改元表过程

    将Sharp的创建函数修改为

    function Sharp:new()
        local new_sharp = { }
    
        local metatable = {}
        metatable.__index = self  --②,self == Sharp
        setmetatable(new_sharp, metatable)  --③ 使用metatable作为元表
    
        return new_sharp
    end

    将Circle的创建函数修改为

    function Circle:new()
        local new_circle = {}
    
        local metatable = {}
        metatable.__index = self --②,self == Circle
        setmetatable(new_circle, metatable) --③使用metatable作为元表
    
        return new_circle
    end

     

    ③调用函数

    local circle = Circle:new()
    circle._val = 2 --覆盖赋值
    circle:sharp_func() --调用父类函数
    circle:circle_func() --调用新函数
    circle:name() --调用覆盖函数
    circle:val() --调用覆盖函数
    
    local circle_2 = Circle:new()
    circle_2._val = 3
    circle_2:val()
    
    circle:val() --再次调用测试

    ④输出结果(完全正确)

     

    ⑤这时候调用被子类覆盖的父类函数就需要修改为

    --调用父类被子类覆盖了的name方法
    function Circle:sharp_name()
        local circle_metatable = getmetatable(self)
        local sharp_metatable = getmetatable(circle_metatable.__index)
        sharp_metatable.__index["name"]()
    end

    ⑥输出结果(完全正确)

    Lua面向对象:

    Lua面向对象之一:简单例子

    Lua面向对象之二:类继承

    Lua面向对象之三:其它一些尝试

  • 相关阅读:
    fiddler 抓取 安卓模拟器 https包
    heidiSQL使用简介
    weblogic重启脚本
    svn命令在linux下的使用
    LVS之NAT和DR服务脚本
    LVS之NAT模型、DR模型配置和持久连接
    apache ab压力测试报错apr_socket_recv
    LVS负载均衡模型及算法概述
    Orcale11g单机安装与卸载
    IPC相关的命令
  • 原文地址:https://www.cnblogs.com/chevin/p/5981620.html
Copyright © 2011-2022 走看看