lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)

lua面向对象实现:

一个类就像是一个创建对象的模具。有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例。lua则没有类的概念,每个对象只能自定义行为和形态。不过,要在lua中模拟类也并不困难。

lua中,面向对象是用元表这个机制来实现。

首先,一般来说一个表和它的元表是不同的个体(不属于同一个表),在创建新的表时,不会自动创建元表。

setmetatable函数:设置元表

setmetatable( 表1 , 表2 )  将表2挂接为表1的元表,并且返回经过挂接后的表1

__index字段:

元表中的__index字段,是一个非常强大的字段,它为回溯查询提供支持。而面向对象的实现基于回溯查询

当访问一个table中不存在的字段时,得到的结果为nil。但是如果这个表有元表的话,这个访问就会查找元表中的__index字段。如果没有__index字段没有赋值,那么访问结果为nil。否则,就由__index字段提供最终的结果。

__index可以赋值为一个函数,也可以是个表。是函数时,就会调用这个函数。是表的时候,就以相同的方式重新访问这个表。

注意:这里出现了三个表的个体,

我们直接操作的表,称之为表A,表A的元表称之为表B,表B的__index字段赋值的表,称之为表C

如果访问表A中的一个字段时,如果找不到,会去查看表A有没有元表B,如果有的话,就会查找B中的__index字段是否有赋值,如果赋值为表C,就会去表C中查找有没有想访问的那个字段,如果找到了,就返回那个字段,如果没有,就返回nil。

lua面向对象--对象创建

我们可以利用元表和元表__index字段来实现类对象的创建

在该类的构造函数中,定义一个新的表,然后把该类(表)设置为新定义的那个表的元表的__index字段,这样,当我们用实例的对象来调用该类的某个字段的时就会去该类中查找调用,这样就实现了对象的实例化。

例子

class.lua

local    class  = {}

function  class:new()

local self = {}     —创建新的表作为实例的对象

setmetatable( self , {__index = class})  —设置class为对象元表的__index

return self         —返回该新表

end

function class:func()

print(“class : func”)

end

return class

main.lua

local class = require(“class”)

s1 = class:new()   — 实例化对象s1

s1:func()               ——->class : func

lua面向对象--继承

lua实现继承和实现对象实例化是一样的,利用元表和元表的__index字段来实现。

例子

class1.lua

local class1 = {}

function class1:func1()

print(“class1 : func1”)

end

class2.lua

local class2 = {}

local class1 = require(“class1”)

function class2:func2()

print(“class2 : func2”)

end

function class2:new()

setmetatable(class2 , {__index = class1})  —设置class1为class2的元表的__index字段来实              现继承

— 实例对象

local self = {}

setmetatable(self , {__index = class2})

return self

end

return class2

main.lua

local class2 = require(“class2”)

local s1 = class2:new()

s1:func1()     ———>class1:func1

s1:func2()     ———>class2:func2

lua面向对象--多态

lua支持多态

例子:

class1.lua

ocal class1 = {x = 0,y = 0}

function class1:new(x,y)

-- body

local self = {}

setmetatable(self,class5)

class1.__index = class1

self.x = x

self.y = y

return self

end

function class1:test()

print(self.x,self.y)

end

function class1:gto()

return 100

end

function class1:gio()

return self:gto()*2

end

return class1

class2.lua

local class2 ={}

local class2 = require("class1")

function class2:new(x,y)

setmetatable(class2, class1)

class1.__index = class2

local self = {}

setmetatable(self, class2)

class2.__index = class2

self.x = x

self.y = y

return self

end

function class2:gto()

return 50

end

return class2

main.lua

class1 = require(“class1”)

class2 = require(“class2”)

s1 = class1:new()

s2 = class2:new()

print(s1:gio())  ——->200

print(s2:gio())  ——>100

—s2对象调用基类class1的gio函数,函数内部调用class2的gto函数,实现了多态。

lua面向对象--多继承

lua中类的多继承实现也是利用的元表和元表的__index字段,不同于对象实例化和单一继承不同的是__index字段赋值的是一个函数而不是一个基类的表。

利用传入__index字段的函数来查找类中找不到的字段(函数中遍历该类继承的多个基类)

查找函数:

local function search(k,plist)

for i = 1,#plist do

local v = plist[i][k]

if v then return v end

end

—plist 为该类的基类的集合 ,k为要查找(调用继承的字段)的字段

实现继承函数:

local function createClass()

local parents = {class1,class2}

setmetatable(class3,{__index = function(t,k)

return search(k,parents)

end

这样就可以实现多继承了。

例子:

class1.lua

local class1 = {}

function class1:func1()

print("class1--func1")

end

return class1

class2.lua

local class2 ={}

function class2:func2()

print("class2:func2")

end

return class2

class3.lua

local class3 = {}

local class1 = require("class1")

local class2 = require("class2")

local function search(k,plist)

for i = 1,#plist do

local v = plist[i][k]

if v then return v end

end

local function createClass()

local parents = {class1,class2}

setmetatable(class3,{__index = function(t,k)

return search(k,parents)

end

function class3:func3()

print("class3:func3")

end

function class3:new()

local self = {}

createClass()

setmetatable(self,class3)

class3.__index = class3

return self

end

return class3

main.lua

local class3 = require("class3")

local s1 = class3:new()

s1:func1()    ————->class1:func1

s1:func2()    ————>class2:func2

s1:func3()    ————>class3:func3

lua面向对象--单例模式

lua的单例模式是利用一个全局表来实现的

例子:

CatManager = {}

CatManager_mt = {__index = CatManager}  —创建一个表做实例对象的元表,__index 设置为 这个单例类

function CatManager:new()

local self = {}

setmetatable( self , CatManager_mt)  —把全局的表CatManager设置为self(新创建表)的元表的__index字段

—每次获得单例时,创建一个self表(对象),该表继承全局表CatManager,每次修改全局表中的字段后,下次再次调用时,该字段都是已经修改过的

return self

end

function CatManager:func1()

print(“func1”)

end

main.lua

require(“CatManager”)

catManager = CatManager:new()

一次导入进来后  ,整个程序都可以用,实现了单例的效果

时间: 2024-10-12 16:07:26

lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)的相关文章

C#面向对象(OOP)入门—第二天—多态和继承(继承)

介绍: 第一天的内容主要是不同情形下的方法重载.这一部分则主要讲面向对象中继承的概念.首先用一个要点图形来定义继承. 继承 一个简单的例子: ClassA: class ClassA:ClassB { public void Display1() { Console.WriteLine("ClassA Display1"); base.Display1(); } } ClassB: class ClassB { public int x = 100; public void Displ

面向对象_实例化对象和类

首先我们可以看一下面向过程式编程 # 面向过程编程 测量对象的元素个个数. s1 = 'fjdsklafsjda' count = 0 for i in s1: count += 1 l1 = [1,2,3,4] count = 0 for i in l1: count += 1 面向过程编程 再来看一下函数式编程 def func(s): count = 0 for i in s: count += 1 return count func('fdsafdsa') func([1,2,3,4])

c++ 植物类 继承多态 菱形继承

#pragma once//头文件 #include <iostream> #include<string> using namespace std; // // 1.实现以下几个类的成员函数 // 2.实现一个虚函数的覆盖及调用 // 3.处理菱形继承问题. // // 植物 class Botany { public: Botany(const string&  name); virtual ~Botany(); virtual void Display(); Bota

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

Java面向对象一(封装 继承 多态 类 对象 方法)

1.封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 如下,人这个类封装了很多人的属性和行为: 2.继承:很好的实现了代码的复用,提高了编程效率. 人{ 年龄(属性一) 身高(属性二) 性别(属性三) 做事(行为之一) 走路(行为之二) 说话(行为之三)} 教师{ 年龄(属性一) 身高(属性二) 性别(属性三) 做事(行为之一) 走路(行为之二) 说话(行为之三) 教书(行为之四)} 教师继承了人的属性和行为,额外多出的是教书的行为.所以可以写成 教师 继承了 人这个类 的

2016/3/21 面向对象: ①定义类 ②实例化对象 ③$this关键字 ④构造函数 ⑤析构函数 ⑥封装 ⑦继承

一:定义类   二:实例化对象 1 //定义类 2 class Ren 3 { 4 var $name; 5 var $sex; 6 var $age; 7 8 function Say() 9 { 10 echo "{$this->name}在说话"; 11 } 12 } 13 //实例化对象 14 $Ren = new Ren(); 15 //调用对象的成员: 16 $Ren->name = "张三"; 17 $Ren->Say(); 显示结果

python开发面向对象基础:接口类&amp;抽象类&amp;多态&amp;多继承

一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 开发中容易出现的问题 1 class Alipay: 2 ''' 3 支付宝支付 4 ''' 5 def pay(self,money): 6 print('支付宝支付了%s元'%money) 7 8 class Applepay: 9 ''' 1

Lua下通过元表模拟OOP编程,继承多态

Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua内核提供的一些特性来间接实现简单的面向对象的编程. 通过Lua中的 table结构  metatable 以及函数可以配合实现OOP,以及继承.这些说白了都是一种伪实现,不建议在Lua下使用多重继承 . 在LUA中你想要 强制实现OOP 你必须需要懂一下几个关键词!! 什么是语法糖? 语法糖即糖衣语法,C/C++升级过程中的面向对象 整体就是一种语法糖 ,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)