Lua实现简单的类,继承,多态 实例

 1 -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法
 2 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体点就是访问自己的成员函数,发现没有函数,然后判断是否有元表和__index元方法(当然都有,而且是必须有),然后就变成了访问元表也就是类的成员,自然就访问了成员函数
 3 Cfx = { m_chang = 0, m_kuan = 0, m_area = 0 }
 4 Cfx.__index = Cfx
 5 function Cfx:new(chang, kuan)
 6     local self = { }
 7     setmetatable(self, Cfx)
 8     self.m_chang = chang
 9     self.m_kuan = kuan
10     self.m_area = chang * kuan
11     return self
12 end
13
14 function Cfx:printArea()
15     print("长方形的面积为:" .. self.m_area)
16 end
17
18 function Cfx:setC(chang, kuan)
19     if chang then
20         self.m_chang = chang
21     end
22     if kuan then
23         self.m_kuan = kuan
24     end
25     self.m_area = self.m_chang * self.m_kuan
26 end
27
28 r1 = Cfx:new(10, 20)
29 r1:printArea()
30 r2 = Cfx:new(30, 40)
31 r2:printArea()
32 r1:setC(_, 50)
33 r2:setC(50)
34 print("----------------------------------------------------------------")
35 r1:printArea()
36 r2:printArea()
37
38
39
40 --Lua实现继承,继承自上面的长方形类,同时具备自身的成员(周长)和一个打印周长的方法
41 --继承也是跟上面所说的类的构建同理,可以看成是C++中的先构造一个父类,然后再构造自己,所以可以理解为有两个类构造出来了
42 Cfx_w ={m_zhouchang=0}
43 Cfx_w.__index=Cfx_w
44 setmetatable(Cfx_w,Cfx)
45
46 function Cfx_w:new(c,k)
47 local self ={}
48  self=Cfx:new(c,k)
49  setmetatable(self ,Cfx_w)
50  self.m_zhouchang=2*(c+k)
51  return self
52 end
53
54
55   function Cfx_w:printZ()
56   self.m_zhouchang=2*(self.m_chang+self.m_kuan)
57     print ("长方形的周长为:" .. self.m_zhouchang)
58     end
59
60 function Cfx_w:printArea()
61 print ("重写父类方法,长方形面积是:".. self.m_area)
62 end
63 r3=Cfx_w:new(10,5)
64 r3:printArea()
65 r3:printZ()
66 print ("****************************************************************")
67 r3:setC(2,2)
68 r3:printArea()
69 r3:printZ()

   

      lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体点就是访问自己的成员函数,发现没有函数,然后判断是否有元表和__index元方法(当然都有,而且是必须有),然后就变成了访问元表也就是类的成员,自然就访问了成员函数。

原文地址:https://www.cnblogs.com/shan-mu/p/11334738.html

时间: 2024-10-11 10:54:44

Lua实现简单的类,继承,多态 实例的相关文章

简单的封装继承多态

首先创建一个工程, 然后创建一个动物类(Animal),然后再创建一个猫类和一个狗类,最后创建一个人类来给动物喂食. 动物类继承NSObject 而猫类和狗类继承动物类 人类喂食也继承NSObject 动物类 //类的声明 #import <Cocoa/Cocoa.h> @interface Animal : NSObject -(void)jiao; -(void)eat; @end //类的实现 #import "Animal.h" @implementation An

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学习]简单的类定义(OO概念)

1 -- 二维向量类 2 3 local P = { 4 x = 0, 5 y = 0 6 } 7 8 Vec2 = P 9 10 --setfenv(1, P) 11 12 local function optAdd(a, b) 13 local o = P:new() 14 o.x = a.x + b.x 15 o.y = a.y + b.y 16 return o 17 end 18 19 function P:new(x, y) 20 o = {} 21 22 -- 构造 -- 23 o

【德州扑克开发记录】在lua层sdk接口类继承自cocos2d类的危害

之前给外包接微信.fb.gp.appstore等,lua调用的类是这么定义的: local Platform_Appstore = class("Platform_Appstore",function() return display.newLayer()end) 咋看一下是个很普通的用法,但却制造了2个非常难以调试的bug,给后来的工作带来了莫大的痛苦. BUG1:ios真机调试,appstore支付后,乱点界面一通后,闪退,xcode报错卡在oc文件的touchbegan中. 这个

Python之路-面向对象&amp;继承和多态&amp;类属性和实例属性&amp;类方法和静态方法

一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强-" 什么是面向对象 面向对象就不像面向过程那样按照功能划分模块了,它所关注的是软件系统有哪些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有哪些特征.哪些行为,以及对象之间的关系,所以说面向对象的开发核心是对象 什么是类 面向对象编程的两个重要的概念:类和对象 类是

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

类的私有属性 公有属性 继承 多态

私有属性 && 公有属性 1 #定义一个最简单的类 2 class person(object): 3 hometown = "china" #公有属性,所有类的对象共用的.使用对象.公有属性只会修改自己对象的公有属性,类名.公有属性会把所有对象的公有属性进行修改. 4 #原因是只要对象不调用公有属性是不会在自己本地创建其内存空间使用类共享的(类的实例化过程),只要本地修改就是在本地创建一个同名的变量而已,相当于局部变量,作用域屏蔽了类的公有属性 5 #构造函数,接收实

Java中关于继承、类、多态、接口的知识点

继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序变得更加简单 继承的实现: 关键字extends:继承其ted他类,可以继承public,protected public class Salary extends Employee super关键字: 作用:调用父类中重写的方法 注意:调父类构造器是第一句可执行语句:默认情况下子类会调用父类的无参

Lua类和类继承实现

Lua本身是不能像C++那样直接实现继承,但我们可以用万能的table表来实现. 以下我总结了三种方式的类以及继承的实现 第一.官方的做法,使用元表实现 原理参照<Programming in lua> Object.lua Object = {class_id = 0} function Object:new(o) o = o or {} setmetatable(o,self) -- 对象o调用不存在的成员时都会去self中查找,而这里的self指的就是Object self.__inde