openresty开发系列23--lua面向对象
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面向对象的更多相关文章
- openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息
openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息 为了实现业务系统针对不同地区IP访问,展示包含不同地区信息的业务交互界面.很多情况下系统需要根据用户访问的IP信息 ...
- openresty开发系列39--nginx+lua实现接口签名安全认证
一)需求背景现在app客户端请求后台服务是非常常用的请求方式,在我们写开放api接口时如何保证数据的安全,我们先看看有哪些安全性的问题 请求来源(身份)是否合法?请求参数被篡改?请求的唯一性(不可复制 ...
- openresty开发系列38--通过Lua+Redis 实现动态封禁IP
openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝 ...
- openresty开发系列24--openresty中lua的引入及使用
openresty开发系列24--openresty中lua的引入及使用 openresty 引入 lua 一)openresty中nginx引入lua方式 1)xxx_by_lua ---> ...
- openresty开发系列32--openresty执行流程之1初始化阶段
openresty开发系列32--openresty执行流程之初始化阶段 一)初始化阶段 1)init_by_lua init_by_lua_block init_by_lua_file语 ...
- openresty开发系列20--lua的时间操作
openresty开发系列20--lua的时间操作 在 Lua 中,函数 time.date 和 difftime 提供了所有的日期和时间功能.在 OpenResty 的世界里,不推荐使用这里的标准时 ...
- openresty开发系列12--lua介绍及常用数据类型简介
openresty开发系列12--lua介绍及常用数据类型简介 lua介绍 1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...
- openresty开发系列37--nginx-lua-redis实现访问频率控制
openresty开发系列37--nginx-lua-redis实现访问频率控制 一)需求背景 在高并发场景下为了防止某个访问ip访问的频率过高,有时候会需要控制用户的访问频次在openresty中, ...
- openresty开发系列36--openresty执行流程之6日志模块处理阶段
openresty开发系列36--openresty执行流程之6日志模块处理阶段 一)header_filter_by_lua 语法:header_filter_by_lua <lua-scri ...
随机推荐
- Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和
Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和 [Problem Description ...
- P2015 二叉苹果树[树形dp+背包]
题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...
- 零基础如何学好python之变量
想要自学python,变量(variable)是必经之路,它是学习python初始时,就会接触到的一个新的知识点,也是一个需要熟知的概念.python是一种动态类型语言,在赋值的执行中可以绑定不同类型 ...
- 《Exceptioning团队》第六次作业:团队项目系统设计改进与详细设计
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握面向对象软件设计方法:2.完善系统设计 ...
- SVM: 实际中使用SVM的一些问题
使用SVM包来求θ,选择C与核函数 我们使用已经编写好的软件包(这些软件包效率高,用得多,是经无数人证明已经很好的可以使用的软件包)来求θ,而不是自己去编写软件来求它们(就像我们现在很少编写软件来求x ...
- Mysql 日期与时间戳的相互转化
select CURDATE(); #获取当前的日期,示例:2019-10-29 select UNIX_TIMESTAMP(CURDATE()); #将当前的时间格式转换为时间戳,示例:由2019- ...
- JVM对象创建
1.JVM对象创建:java程序运行过程中,无时无刻都有对象被创建出来.在语言层面上就是new关键字. 2.JVM对象创建过程: (1)JVM遇到一条new指令后,首先会去常量池中,检查这个指令的参数 ...
- python链接oracle数据库以及数据库的增删改查实例
初次使用python链接oracle,所以想记录下我遇到的问题,便于向我这样初次尝试的朋友能够快速的配置好环境进入开发环节. 1.首先,python链接oracle数据库需要配置好环境. 我的相关环境 ...
- pcl-qt使用QVTKWidget 与PCLVisualizer 显示雷达点云
#ifndef PCLVIEWER_H #define PCLVIEWER_H #include "defines.h" #include <iostream> #in ...
- 12、基于yarn的提交模式
一.三种提交模式 1.Spark内核架构,其实就是第一种模式,standalone模式,基于Spark自己的Master-Worker集群. 2.第二种,是基于YARN的yarn-cluster模式. ...