openresty开发系列23--lua面向对象

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。
java,c++,.net等都支持面向对象

面向对象特征
1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,
    而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,
    可以通过指向基类的指针,来调用实现派生类中的方法。
4) 抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,
    并且可以在最恰当的继承级别解释问题。

一)Lua 中面向对象
对象由属性和方法组成,lua中的面向对象是用table来描述对象的属性,function表示方法;
LUA中的类可以通过table + function模拟出来。

一个简单实例
以下简单的类代表矩形类,包含了二个属性:length 和 width;getArea方法用获取面积大小

新建rect.lua脚本

local rect = {length = 0, width = 0}

-- 派生类的方法 new
function rect:new (length,width)
  local o = {
     --设定各个项的值
     length = length or 0,
     width = width or 0
  }
  setmetatable(o, {__index = self})
  return o
end

-- 派生类的方法 getArea
function rect:getArea ()
  return self.length * self.width
end

return rect

-----------------test.lua------------------------

引用模块
local rect = require("rect")

创建对象
创建对象是为类的实例分配内存的过程。每个类都有属于自己的内存并共享公共数据。

local rect1 = rect:new(10,20)
local rect2 = rect:new(5,6)

访问属性  ----》 rect1.length
访问成员函数  ----》rect1:getArea()

print("长度1:",rect1.length);
print("面积1:",rect1:getArea());  --- 点号 和 冒号 调用前面课程已经介绍
print("长度2:",rect2.length);
print("面积2:",rect2:getArea());

二)Lua继承

-------------------shape基类---------------------------

local shape = {name = ""}

-- 创建实体对象方法 new
function shape:new (name)
  local o = {
    name = name or "shape"
  }
  setmetatable(o, {__index = self})
  return o
end

-- 获取周长的方法 getPerimeter
function shape:getPerimeter ()
  print("getPerimeter in shape");
  return 0
end

-- 获取面积的方法 getArea
function shape:getArea ()
  print("getArea in shape");
  return 0
end

function shape:getVum ()
  print("getVum in shape");
  return 0
end

return shape

----------------------triangle继承类----------------------------

local shape = require("shape")

local triangle = {}

-- 派生类的方法 new
function triangle:new (name,a1,a2,a3)
  local obj = shape:new(name);
 
  --1)当方法在子类中查询不到时,再去父类中去查找。
  local super_mt = getmetatable(obj);
  setmetatable(self, super_mt);
 
  --2)把父类的元表 赋值super对象
  obj.super = setmetatable({}, super_mt)
 
  --3)属性赋值
  obj.a1 = a1 or 0;
  obj.a2 = a2 or 0;
  obj.a3 = a3 or 0;
 
  setmetatable(obj, { __index = self })
 
  return obj;
end

-- 派生类的方法 getPerimeter
function triangle:getPerimeter()
  print("getPerimeter in triangle");
  return (self.a1 + self.a2 + self.a3);
end

-- 派生类的方法 getHalfPerimeter
function triangle:getHalfPerimeter()
  print("getHalfPerimeter in triangle");
  return (self.a1 + self.a2 + self.a3) / 2
end

return triangle

------------------test-----------------------

local rect = require("rect")
--local shape = require("shape")
local triangle = require("triangle")
 
local rect1 = rect:new(10,20)
local rect2 = rect:new(5,6)

--local shape1 = shape:new();

local triangle1 = triangle:new("t1",1,2,3)
local triangle2 = triangle:new("t2",6,7,8)

print("长度1:",rect1.length);
print("面积1:",rect1:getArea());
print("===============");
print("长度2:",rect2.length);
print("面积2:",rect2:getArea());
print("===============");
--print("shape1 getPerimeter:",shape1:getPerimeter())
print("===============");
----覆盖了shape的方法
print("t1 getPerimeter:",triangle1:getPerimeter())
print("t1 getHalfPerimeter:",triangle1:getHalfPerimeter())

print("t2 getPerimeter:",triangle2:getPerimeter())
print("t2 getHalfPerimeter:",triangle2:getHalfPerimeter())

---- 从shape继承的getVum方法
print("t1 getVum:",triangle1:getVum())
print("t2 getVum:",triangle2:getVum())
print("===============");
print("t2 super getPerimeter:",triangle2.super:getPerimeter())

openresty开发系列23--lua面向对象的更多相关文章

  1. openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息

    openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息 为了实现业务系统针对不同地区IP访问,展示包含不同地区信息的业务交互界面.很多情况下系统需要根据用户访问的IP信息 ...

  2. openresty开发系列39--nginx+lua实现接口签名安全认证

    一)需求背景现在app客户端请求后台服务是非常常用的请求方式,在我们写开放api接口时如何保证数据的安全,我们先看看有哪些安全性的问题 请求来源(身份)是否合法?请求参数被篡改?请求的唯一性(不可复制 ...

  3. openresty开发系列38--通过Lua+Redis 实现动态封禁IP

    openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝 ...

  4. openresty开发系列24--openresty中lua的引入及使用

    openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua   ---> ...

  5. openresty开发系列32--openresty执行流程之1初始化阶段

    openresty开发系列32--openresty执行流程之初始化阶段 一)初始化阶段 1)init_by_lua   init_by_lua_block     init_by_lua_file语 ...

  6. openresty开发系列20--lua的时间操作

    openresty开发系列20--lua的时间操作 在 Lua 中,函数 time.date 和 difftime 提供了所有的日期和时间功能.在 OpenResty 的世界里,不推荐使用这里的标准时 ...

  7. openresty开发系列12--lua介绍及常用数据类型简介

    openresty开发系列12--lua介绍及常用数据类型简介 lua介绍  1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...

  8. openresty开发系列37--nginx-lua-redis实现访问频率控制

    openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次在openresty中, ...

  9. openresty开发系列36--openresty执行流程之6日志模块处理阶段

    openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...

随机推荐

  1. Vue中mapMutations映射方法的问题

    今天又被自己给蠢到,找了半天没发现问题.大家看下代码. mutation-types.js 里我新增了一个类型.INIT_CURRENTORDER export const GET_USERINFO ...

  2. Maven02 -学习总结&学习文档 -踩坑123

    maven在开发中的作用 ①自动添加第三方 jar 包 在今天的 JavaEE 开发领域,有大量的第三方框架和工具可以供我们使用.要使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF/li ...

  3. P2055 [ZJOI2009]假期的宿舍[二分图匹配]

    题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题. 比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识 ...

  4. Dynamics 365 on-premises 安装

    安装Dynamics 365环境配置要求: 系统版本:Windows Server 2016 SQL 版本: Microsoft SQL Server 2016 SP2 Dynamics 365 版本 ...

  5. Leonardo的笔记本LA 3641——置换的乘法

    题意 给出26个大写字母的置换 $B$,问是否存在一个置换 $A$,使得 $A^2=B$. 分析 首先,若A=BC,若B和C都能表示成两个相同循环的乘积,则A也能. 因为,不相交的循环的乘积满足交换律 ...

  6. 使用自签CA,Server,client证书和双向认证

    服务端代码 package main import ( "crypto/tls" "crypto/x509" "google.golang.org/g ...

  7. Python 的内置字符串方法(收藏专用)

    Python 的内置字符串方法(收藏专用) method 字符串 string python3.x  python 4.7k 次阅读  ·  读完需要 44 分钟 5 字符串处理是非常常用的技能,但 ...

  8. Oracle CAST() 函数 数据类型的转换

    CAST()函数可以进行数据类型的转换. CAST()函数的参数有两部分,源值和目标数据类型,中间用AS关键字分隔. 以下例子均通过本人测试. 一.转换列或值 语法:cast( 列名/值 as 数据类 ...

  9. COM Error Code(HRESULT)部分摘录

    Return value/code Description 0x00030200 STG_S_CONVERTED The underlying file was converted to compou ...

  10. ELK实践

    一.ElasticSearch+FileBeat+Kibana搭建平台 在C# 里面运行程序,输出日志(xxx.log 文本文件)到FileBeat配置的路径下面. 平台搭建,参考之前的随笔. Fil ...