概述

我们总所周知对象是由属性和方法组成的,要用lua要描述一个对象,也必然要有这两个特性,属性和方法。lua的基本结构是table,所以Lua的类,其实都是table,因为它可以存储普通的变量又可以存储方法,我们利用table就可以描述一个对象的属性和方法。

对象

其实lua要模拟一个对象,关键就在于__index设置元表索引这块,它主要起到索引失败后该怎么办,如果它指向一张表,那么__index索引失败后,它会到这张表中去查找有没有你指定的函数或成员值,如果有,__index方法被调用时会返回该函数的返回值。

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc
--- DateTime: 2019/12/10 10:14
---
Class = {x,y}
Class.__index = Class
function Class:new(x,y)
local self = {}
setmetatable(self,Class)
self.x = x
self.y = y
return self
end
function Class:getResult()
return 0
end

这样一个lua的对象就创建完成了。马克思教育我们实践是检验真理的唯一标准,所以我们用lua的写面向对象的思想写一个计算器的demo来看下是怎么实现继承与多态。

加法

继承刚才写得Class类,就有了x,y值,可以进行加法运算,以此类推,我们进行减法,乘法,除法的类编写

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc
--- DateTime: 2019/12/10 10:17
---
require("operation.Operation")
AddClass = {}
--设置元表为Class
setmetatable(AddClass,Class)
AddClass.__index = AddClass
function AddClass:new(x,y)
local self = {}
--调用父类的构造函数
self = Class:new(x,y)
setmetatable(self,AddClass)
return self
end
--重写父类函数
function AddClass:getResult()
return self.x + self.y
end

减法

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc.
--- DateTime: 2019/12/10 10:35
---
require("operation.Operation")
SubClass = {}
setmetatable(SubClass,Class)
SubClass.__index = SubClass
function SubClass:new(x,y)
local self = {}
self = Class:new(x,y)
setmetatable(self,SubClass)
return self
end
function SubClass:getResult()
return self.x - self.y
end

乘法

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc.
--- DateTime: 2019/12/10 10:39
---
require("operation.Operation")
MulClass = {}
setmetatable(MulClass,Class)
MulClass.__index = MulClass
function MulClass:new(x,y)
local self = {}
self = Class:new(x,y)
setmetatable(self,MulClass)
return self
end
function MulClass:getResult()
return self.x * self.y
end

除法

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc.
--- DateTime: 2019/12/10 10:42
---
require("operation.Operation")
DivClass = {}
setmetatable(DivClass,Class)
DivClass.__index = DivClass
function DivClass:new(x,y)
local self = {}
self = Class:new(x,y)
setmetatable(self,DivClass)
return self
end
function DivClass:getResult()
if self.y == 0 then
print("除数不能为零")
return -1
end
return self.x / self.y
end

多态

我们创建一个管理工厂类,管理所有运算。这样一来我们如果要在添加一个开根号或者平方运行,只要在添加根号类和修改工厂的代码,其他就原封不动

---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by hwc.
--- DateTime: 2019/12/10 10:46
---
require("operation.OperationAdd")
require("operation.OperationSub")
require("operation.OperationMul")
require("operation.OperationDiv")
FactoryClass = {}
FactoryClass.__index = FactoryClass
function FactoryClass:new(x,y,z)
local self = {}
setmetatable(self,FactoryClass)
self.x = x
self.y = y
self.z = z
return self
end
function FactoryClass:result()
local myTable = {}
if self.z == "+" then
myTable = AddClass:new(self.x,self.y)
return myTable
elseif self.z == "-" then
myTable = SubClass:new(self.x,self.y)
return myTable
elseif self.z == "*" then
myTable = MulClass:new(self.x,self.y)
return myTable
elseif self.z == "/" then
myTable = DivClass:new(self.x,self.y)
return myTable
end
end

添加一个Main类运行

总结

一个利用面向对象思想的lua简单计算器就完成了,我们宰Lua中模拟了类,继承,和多态的特征,起到了可复用,可扩展,解耦的特性,为lua开发web项目带来了极大的便利

Lua的面向对象,封装,继承,多态的更多相关文章

  1. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  2. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  3. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  6. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  7. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  8. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  9. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  10. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

随机推荐

  1. 通俗易懂了解Vue双向绑定原理及实现

    看到一篇文章,觉得写得挺好的,拿过来给大家分享一下,刚好解答了一些困扰我的一些疑惑!!! 1. 前言 每当被问到Vue数据双向绑定原理的时候,大家可能都会脱口而出:Vue内部通过Object.defi ...

  2. Python基本数据结构之字典

    定义: {key1:value1,key2:value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 示例: dic4={ 'name': 'xiaohu', 'age': 20, ...

  3. 高德地图3D菱形 区域点击搜索

    更新一波吧 <!doctype html> <html lang="zh-CN"> <head> <!-- 原始地址://webapi.a ...

  4. thinkphp 比RBAC更好的权限认证方式(Auth类认证)

    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...

  5. nyoj 41-三个数从小到大排序(STL --> sort(a, a+n) 升序)

    41-三个数从小到大排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:31 submit:44 题目描述: 现在要写一个程序,实现给三个数排序的功 ...

  6. nyoj 82-迷宫寻宝(一) (多重BFS)

    82-迷宫寻宝(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:5 难度:4 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...

  7. 力扣(LeetCode)最后一个单词的长度 个人题解

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...

  8. mongodb存储二进制数据

    mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...

  9. dbstructsync 多套mysql环境表、字段、索引的差异sql产出(原创)

    最近写了一个工具(比较两套测试环境数据库表.表字段.索引的差异) 功能:可以比较两套环境中mysql指定库中表.表字段及索引的差异,返回具体需要同步的执行sql A环境的数据库db 作为sourced ...

  10. Yum —— CentOS 下包管理工具 学习笔记

    环境:CentOS 7 (阿里云服务器) 一.linux 发行版下的包管理阵营 包管理系统 除了方便你安装和管理包之外,还能帮你解决依赖问题. 下面就介绍2个最主要的: 1.Debian 系 - dp ...