vanilla-zh
  • 简介
  • 快速上手
    • Hello World
    • 如何调试
    • 如何新增一个Controller
    • 如何使用models/dao
    • 如何使用models/service
  • APIs
    • 配置
    • Bootstrap
    • Controllers
    • 模板引擎
    • 插件
    • 路由
    • 异常处理
    • 内建类
  • Libs
    • Cookie
  • 进阶
    • 页缓存
    • 面向对象
    • Vanilla 包开发
  • OpenResty
    • OR文档精炼
      • ngx.timer
      • ngx.config
      • coroutine
      • ngx.thread
  • ChangeLogs
    • vanilla-0.1.0.rc7
    • vanilla-0.1.0.rc6
    • vanilla-0.1.0.rc5
    • vanilla-0.1.0.rc4
    • vanilla-0.1.0.rc3
  • 杂项
    • Nginx执行阶段
    • GDB 调试 OpenResty
    • OpenResty 正则示例收集
    • 基于 OpenResty 安装 Luarocks
    • Vanilla集成的一些优秀第三方包
      • QCon 2015 Broken Performance Tools
  • Vanilla使用经验
    • 用户列表
Powered by GitBook
On this page
  • 一个简单的 Vanilla 类
  • 类定义
  • 类使用
  • 类继承
  • 类定义
  • 类使用

Was this helpful?

  1. 进阶

面向对象

Lua 提供了部分面向对象的语法糖,这仅仅能在开发中提供一个功能不完备的独立 Class 的使用,有 self 可以来引用 LUA 表的某些属性和方法,但是更多的面向对象特性,比如继承,比如类的构造等,LUA 支持的并不是非常好,日常的业务开发中,我们确实有些通用的逻辑可能需要复用,或者数据需要共享,需要有父子关系等等。所以我们在 Vanilla 中,简单封装了部分面向对象的特性,这里我们简单介绍其使用方法。

一个简单的 Vanilla 类

下面我们看一个例子:

类定义

local LibA = Class("LibA")

function LibA:idevzDo(params)
    local params = params or { lib_bb = 'idevzDo LibA'}
    return params
end

function LibA:__construct( data )
    self.name = 'name-->' .. data.name
    self.sex = 'sex-->' .. data.sex
end

return LibA

代码释意:

  • Class("LibA") 声明一个 Vanilla 类,类名为 LibA

  • LibA:__construct( data ) 提供了一个类 LibA 的构造器,并对相应的属性进行初始化

类使用

local LibA = LoadLibrary('aa')
local liba_instance = LibA({name='idevz',sex='man'})
print_r(liba_instance.sex)

执行结果 sex-->man

代码释意:(类使用的时候需要注意,类的使用分为类文件的加载 Load( 如这里的 LoadLibrary ) 和实例化 LibA()) 两个步骤

  • local LibA = LoadLibrary('aa') 载入类名为 LibA 的类

  • local liba_instance = LibA({name='idevz',sex='man'}) 传入表 {name='idevz',sex='man'} 对类进行相关的实例化

  • liba_instance.sex 是对实例属性的引用

注:载入和实例化也可以一步达成 local liba_instance = LoadLibrary('aa')({name='idevz',sex='man'})

类继承

下面我么定义一个类 LibB,并使之集成于 LibA

类定义

local LibB = Class("LibB", LoadLibrary('LibA'))

function LibB:__construct( data )
    local data = data or {name='kk', sex='xxx'}
    data.sex = data.sex .. '-->son'
    self.parent:__construct(data)
end

return LibB

代码释意:

  • Class("LibB", LoadLibrary('LibA')) 声明一个 Vanilla 类,类名为 LibB 继承自类 LibA

  • self.parent:__construct(data) 构造器中调用父类的构造器

类使用

local LibB = LoadLibrary('LibB')
local libb_instance = LibB({name='idevz',sex='man'})
print_r(libb_instance:idevzDo({doo='xxx'})['doo'])

执行结果 xxx

代码释意:

  • libb_instance:idevzDo 调用父类的 idevzDo 方法

Previous页缓存NextVanilla 包开发

Last updated 6 years ago

Was this helpful?