MENU

Lua 实现类以及类继承特性

January 29, 2022 • Read: 421 • Lua

实现代码

function class(classname, super)
    local superType = type(super);
    local cls;
 
    --如果父类既不是函数也不是table则说明父类为空
    if superType ~= "function" and superType ~= "table" then
        superType = nil;
        super = nil;
    end;
 
    --如果父类的类型是函数或者是C对象
    if superType == "function" or (super and super.__ctype == 1) then
        -- inherited from native C++ Object
        cls = {};
 
        --如果父类是表则复制成员并且设置这个类的继承信息
        --如果是函数类型则设置构造方法并且设置ctor函数
        if superType == "table" then
            -- copy fields from super
            for k,v in pairs(super) do cls[k] = v end;
            cls.__create = super.__create;
            cls.super    = super;
        else
            cls.__create = super;
            cls.ctor = function() end;
        end;
 
        --设置类型的名称
        cls.__cname = classname;
        cls.__ctype = 1;
 
        --定义该类型的创建实例的函数为基类的构造函数后复制到子类实例
        --并且调用子数的ctor方法
        function cls.new(...)
            local instance = cls.__create(...);
            -- copy fields from class to native object
            for k,v in pairs(cls) do instance[k] = v end;
            instance.class = cls;
            instance:ctor(...);
            return instance;
        end;
    else
        --如果是继承自普通的lua表,则设置一下原型,并且构造实例后也会调用ctor方法
        -- inherited from Lua Object
        if super then
            cls = {};
            setmetatable(cls, {__index = super});
            cls.super = super;
        else
            cls = {ctor = function() end};
        end;
 
        cls.__cname = classname;
        cls.__ctype = 2; -- lua
        cls.__index = cls;

        function cls.new(...)
            local instance = setmetatable({}, cls);
            instance.class = cls;
            if cls.super ~= nil then
                cls.super.ctor(instance,...);
            end;
            instance:ctor(...);
            return instance;
        end;
    end;
    return cls;
end;

解析

1.super的类型: superType = type(super)

2.superType可以为 function , table ,当不为这两种类型的时候我们将之置为nil

3.superType为 function 的时候,表示从C++对象继承

4.superType为 table 的时候,还要看其 __ctype 值,1表示继承自C++对象;2表示继承自lua表对象

5.superType为 nil 的时候,从lua表继承

一般情况下,superType为function的时候,表示继承的是一个C++对象,这个时候构造函数ctor里不需要调用父类的构造函数;其它情况,一般都需要在ctor里调用父类的构造函数。

回到上个页面 QR Code
QR Code for this page
Tipping QR Code