BZ易风

导航

 

面向对象

步骤

1: 定义一个类的表 后面作为 类的实例的元表:

2: 定义一个类的实例的表

3: 为这个实例的表加一个元表,并且元表的__index指向类的表

4:利用self机制,绑定实例对象。 当 表的实例:表的函数 的时候,隐式的帮我们传递了实例的表为self 到函数里面

-- lua是没有面向对象语法的,我们可以模拟
local base = {}
--base的成员函数
function base:test()
    print("base:test", self)    --此时的self对象为谁调用的就是谁
end

function base:new(instant)
    if not instant then         --如果没有实例 或者传过来的实例为空
        instant = {}            --那么就创建一个空表作为类的实例
    end
    setmetatable(instant, {__index = self })  --self为谁调用的new就是谁  如果有实例 那么在实例的基础上扩展实例表
    return instant
end

-- base叫做类的表

--做一个类的实例
local b = base:new()    --此时new函数中的self对象是base
-- 在new里面吧新创建的实例的表的元表变成了base
print("b instance ==", b)  --打印看下b的地址是否跟test中的self一致
b:test()                --test中的self对象就是b
--LUA: b instance ==    table: 0000017FA84AB150
--LUA: base:test    table: 0000017FA84AB150

 

继承

1: 子类的表是父类的一个实例
2: 子类的表作为一个原型再new了一个表;
类的实实例-->元表-->子类的表-->元表-->父类的表;
3: 现在子类的实例找,找不到到元表找,元表找不到,到元表的元表找;
4: 子类重载父类的函数;
5: 子类调用父类的函数;

  

local test = {}
-- lua是没有面向对象语法的,我们可以模拟
local base = {}
--base的成员函数
function base:test()
    print("base:test", self)    --此时的self对象为谁调用的就是谁
end

function base:new(instant)
    if not instant then         --如果没有实例 或者传过来的实例为空
        instant = {}            --那么就创建一个空表作为类的实例
    end
    setmetatable(instant, {__index = self })  --self为谁调用的new就是谁
    return instant
end

-- base叫做类的表

--做一个类的实例
local b = base:new()    --此时new函数中的self对象是base
-- 在new里面吧新创建的实例的表的元表变成了base
print("b instance ==", b)  --打印看下b的地址是否跟test中的self一致
b:test()                --test中的self对象就是b
--LUA: b instance ==    table: 0000017FA84AB150
--LUA: base:test    table: 0000017FA84AB150


--继承
-- 基类 person
-- 子类 男人

--基类的表
local person = {}
function person:test()
    print("person:test", self)
end
function person:get_age()
     print("person:get_age", self)
end
function person:new(instant)
    if not instant then
        instant = {}
    end
    setmetatable(instant, {__index = self})
    return instant
end

--子类的表
local man = person:new()
function man:test_man()
    print("man:test_man", self)
end

function man:test_man2()
    print("man:test_man2")
end

--重载
function man:get_age()
    print("man:get_age", self)
    --如何调用基类的函数
    person.get_age(self)
end

-- 为这个man类实例化一个类的表
local p = man:new()  --man本身没有new 那么它就会去person类找new 同时把man作为new函数里面的self传进去作为p的元表

print("p==", p)     --LUA: p==    table: 0000017FB6C76170
p:test_man()        --调用man里面的test_man  LUA: man:test_man    table: 0000017FB6C76170
p:test()            --man里面找不到,则去P元表的元表person里面去找,然后调用  LUA: person:test    table: 0000017FB6C76170
--调用重载函数
p:get_age()         --p表没有,则去man里查找,查到到了 则不会再往上查找了 调用的就是子类的get_age  man:get_age

 

 

posted on 2023-02-09 12:12  BZ易风  阅读(75)  评论(0编辑  收藏  举报