You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua面向对象编程优化:实现无self参数的类实例化

优化LibListView类的实例化逻辑(无需传入self参数)

因为你的LibListView是游戏内置Frame类的派生类,要实现无参数实例化,核心是在New方法内部自行创建Frame实例,代替外部传入的方式。

修改后的完整代码

LibListView = {}

function LibListView:New()
    -- 内部创建游戏内置Frame实例,作为类的基础对象
    local frame = CreateFrame("Frame")
    -- 若需创建特定类型Frame(如ScrollFrame),可改为 CreateFrame("ScrollFrame")

    -- 定义类的属性与方法集合
    local listviewmt = {
        buttons = {}, 
        data = {},
        initiated = true,
    
        -- 绑定当前Frame实例的原生SetScript方法,避免全局调用上下文错误
        OldSetScript = frame.SetScript,
        SetScript = function(self, handler, fnctn)
            local scripts = "OnHide,OnLoad,OnMouseWheel,OnSizeChanged,OnShow,OnUpdate"
            if string.find(scripts, handler) then
                self:HookScript(handler, fnctn)
            else
                self.OldSetScript(self, handler, fnctn)
            end
        end,
        -- 其他属性和方法可继续在此定义
    }

    -- 设置元表继承:让listviewmt优先继承Frame的元表,再作为实例的__index
    setmetatable(frame, { __index = setmetatable(listviewmt, getmetatable(frame)) })

    -- 返回创建好的实例
    return frame
end

关键修改说明

  • 内部封装实例创建:通过CreateFrame("Frame")直接生成游戏内置Frame对象,无需外部传入self,把实例创建逻辑完全封装在类内部。
  • 修正方法绑定:将原来的全局SetScript改为绑定到当前实例的frame.SetScript,避免调用时的上下文错误。
  • 保留原有继承逻辑:继续使用双层元表设置,确保LibListView的方法不会覆盖Frame已有的元表,同时能正确继承两者的属性与方法。

使用方式

现在可以直接通过无参数调用创建实例:

local listview = LibListView:New()

内容的提问来源于stack exchange,提问作者user3204810

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:24:58