博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象
阅读量:6675 次
发布时间:2019-06-25

本文共 4249 字,大约阅读时间需要 14 分钟。

1.self

在这里插入图片描述

Account={
balance=0}function Account.with(v) Account.balance= Account.balance-vendAccount.with(100)print(Account.balance)

在这里插入图片描述

local person={
name="nAMW",age=26}function person.eat(self) print(self.name.."今年"..self.age.."岁了") end person2={
name="nAMW55",age=100,eat=person.eat} person2:eat() --nAMW55今年100岁了 person:eat()--nAMW今年26岁了

2.类

在这里插入图片描述

local Account={
balance=0}function Account:withdraw(v) self.balance=self.balance-vendfunction Account:deposit(v) self.balance=self.balance+vendfunction Account:new(o) o=o or {
} return setmetatable(o, {
__index=self})enda= Account:new({
balance=100})print(a.balance) --100a:deposit(100)print(a.balance) --200

3.继承

在这里插入图片描述
在这里插入图片描述

local Account={
balance=0}function Account:new(o) o=o or {
} return setmetatable(o, {
__index=self})endfunction Account:deposit(v) self.balance=self.balance+vendfunction Account:withdraw(v) if v>self.balance then return end self.balance=self.balance-vendSpecialAccount=Account:new()s=SpecialAccount:new({
limit=1000})s:deposit(100)print(s.balance) --100
SpecialAccount=Account:new()function SpecialAccount:withdraw(v)print(55)ends=SpecialAccount:new({
limit=1000})s:withdraw(100) --55
SpecialAccount=Account:new()function SpecialAccount:withdraw(v)self:getlimit()endfunction SpecialAccount:getlimit() print("SpecialAccount:getlimit")ends=SpecialAccount:new({
limit=1000})function s:getlimit() print("s:getlimit")ends:withdraw(100) --s:getlimit

4.多重继承

在这里插入图片描述

在这里插入图片描述

local function search(k,plist)    for i=1,#plist do       local v =plist[i][k]       if v then        return v        end    endendfunction createClass(...)    local c = {
} local parents={
...}setmetatable(c, {
__index=function(t,k) return search(k,parents)end}) c.__index=c function c:new(o) o=o or {
} return setmetatable(o,c) end return cendNamed={
}function Named:getName() return self.nameendfunction Named:setName(name) self.name=nameendlocal Account={
balance=0}function Account:deposit(v) self.balance=self.balance+vendfunction Account:withdraw(v) if v>self.balance then return end self.balance=self.balance-vendNamedAccount=createClass(Account,Named)NamedAccount:setName("pllp") print(NamedAccount:getName()) --pllpprint(NamedAccount.balance) --0
--多重继承是查找两个或以上的table。function search(classes,key )    for i = 1, #classes do        local value=classes[i][key]        if value then        return value        end    endendlocal t1 = {
name = "hehe"};local t2 = {
game = "who"};print(search({
t1, t2}, "game"));--这里的classes参数,是一个table,这个table里又存放了多个table,也就是我们想要继承的那些类。--而key就是要查找的字段。--只需要遍历所有的table,判断这个字段是否在某个table里,找到之后,就返回这个值。--我们的测试代码就是从t1、t2中查找game这个字段,t1、t1可以看成是两个类。

createClass函数就是用来创建一个继承了多个类的子类,有点小复杂,慢慢分析:

1) 参数是一个可变参数,我们要将多个被继承的类作为参数传递进来

2) parents用于保存这些被继承的类

3) 创建一个新的table——child,它就是我们想要的那个继承了多个类的子类

4) 给child设置元表,并且设置index元方法,index元方法可以是一个函数,当它是一个函数时,它的参数就是元表所属的table,以及要查找的字段名。

5) 我们在__index元方法函数里调用search函数,从多个父类中查找所需的字段。于是,当调用child的某个函数时,就会从各个父类中查找,这已经完成了继承的工作了。

6) 接下来就是我们所熟悉的new函数,用来创建child的子类。

7) 最后返回child,一切都完成了。

--多重继承是查找两个或以上的table。function search(classes,key )    for i = 1, #classes do        local value=classes[i][key]        if value then        return value        end    endend--参数是一个可变参数,我们要将多个被继承的类作为参数传递进来function createClass(...)    local parents={
...} local child={
} -- 设置类的元表 setmetatable(child,{
__index=function(table,key ) return search(parents,key) end}) -- 给类新增一个new函数,用于创建对象 function child:new( ) o = o or {
} return setmetatable(o,{
__index=child}) end return childendlocal person={
}function person:hellow() print("person:hellow")endlocal student={
}function student:study() print("student:study")endlocal newClass=createClass(person,student)newClass:study() --student:studynewClass:hellow() --person:hellow

5.类的私有性

在这里插入图片描述

function newAccount(initBalance)    local self={
balance=initBalance} local withdraw=function(v) self.balance=self.balance-v end local getbalance=function() return self.balance end return {
withdraw=withdraw,getbalance=getbalance}endcc=newAccount(100)cc.withdraw(40)print(cc.getbalance())--60

6.单方法对象

在这里插入图片描述
7.对偶表示
在这里插入图片描述

转载地址:http://jbrxo.baihongyu.com/

你可能感兴趣的文章
Power Designer数据库建模工具,正向、逆向工程
查看>>
Libevent学习-02:搭建CentOS下的开发环境
查看>>
yum install 与 yum groupinstall 的区别
查看>>
Go基础系列:读取标准输入(一)
查看>>
PHP协程入门详解
查看>>
Java_Reflect_1
查看>>
HTML中的<table>标签及其子元素标签,JS中DOM对<table>的操作
查看>>
在linux中执行wget命令提示 -bash: wget: command not found 解决方法
查看>>
MobPush推送证书制作
查看>>
springmvc源码解析之配置加载ContextLoadListener
查看>>
网站安全防护工作
查看>>
如何判断一个以太坊地址是不是合约?
查看>>
逆袭!? 期待下一个“BCH”出现
查看>>
opengl es3.0学习篇五:图元装配跟光栅化
查看>>
Qt之添加菜单项&状态栏
查看>>
负载均衡在分布式架构中是怎么玩起来的?
查看>>
Java程序员在工作的同时应该具备什么样的能力?
查看>>
Dubbo深入分析之Cluster层
查看>>
分析Padavan源代码,二
查看>>
WordPress的WPML外挂出问题恐出现安全漏洞
查看>>