Lua的面向对象,封装,继承,多态
概述
我们总所周知对象是由属性和方法组成的,要用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的面向对象,封装,继承,多态的更多相关文章
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- 浅谈学习C++时用到的【封装继承多态】三个概念
封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- OOP三大核心封装继承多态
OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
随机推荐
- 求和:fft,表达式化简
$f(n)=\sum\limits_{i=0}^{n} \sum\limits_{j=0}^{i} S(i,j) \times 2^j \times j!$ 其中$S(i,j)$为第二类斯特林数,公式 ...
- Docker的Ubuntu16.04容器如何汉化
最近发现docker hub中的vnc镜像大部分是没有安装语言包的,试了好多天才把他搞出来. 下面为实现步奏. 网盘软件地址 ://pan.baidu.com/share/link?shareid=3 ...
- Python实现王者荣耀小助手(二)
接下来我们获取英雄和武器信息,详细代码KingGlory.py如下(代码中有详细注解): # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : ...
- Vue基础系列(三)——Vue模板中的数据绑定语法
写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家和我一起交流. VUE基础系列目录 < ...
- HTTPS加密流程理解
HTTPS加密流程 由于HTTP的内容在网络上实际是明文传输,并且也没有身份验证之类的安全措施,所以容易遭到挟持与攻击 HTTPS是通过SSL(安全套接层)和TLS(安全传输协议)的组合使用,加密TC ...
- HTMLTestRunner加入logging输出
使用HTMLTestRunner生成html的测试报告的时候,报告中只有console输出,logging的输出无法保存, 如果要在报告中加入每一个测试用例执行的logging信息,则需要改HTMLT ...
- c#数据结构之Array、ArrayList、List、LinkedList对比分析
一.前言: 在c#数据结构中,集合的应用非常广泛,无论是做BS架构还是CS架构开发,都离不开集合的使用,比如我们常见的集合包括:Array.ArrayList.List.LinkedList等.这一些 ...
- 支付宝小程序和微信小程序的区别(部分)
支付宝小程序和微信小程序之间的互相转换 1.首先是文件名 微信小程序 wxss ------ 支付宝小程序 acss 微信小程序 wxml ------ 支付宝小程序 axml 2.调用方法前缀 微信 ...
- Java 读取Word批注中的文本和图片
本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...
- Python 常用模块系列学习(3)--configparser module
configpaser 模块----用于生成和修改常见配置文档 1. config 对象的创建: import configparser #导入模块 config = configparser.Con ...