lua面向对象学习随笔 --类与实例

面向对象最基本的就是两点:类,对象。

但是lua是无类型的,要实现面向对象只能模拟实现。

其实他们都是表,多了个__index属性,就模拟出了实现“类和继承”的效果。

面对Lua千万别用c++的类来类比,不然会误入歧途!

它就是一个table而已下面一个典型的定义一个“类”的方式。

class={}
function class:new(o)
    local o=o or {}
    setmetatable(o,self)
    self.__index=self
    o:ctor()
    return o
end

第一行,因为是个表当然要定义下表结构。

第二行,这里等于function class.new(class,o),self==class。这样写是方面后面继承。

第三行,定义或者获取外部一个o表,这个才是我们模拟的所谓“对象”的实体。

第四,五行,一起看 setmetatable(o,self)  self.__index=self,就是让class成为o表的元表,index也是class,这样o里没有的就找class表读取。不懂可以找找__index相关知识。

最后,o:ctor() 模拟构造函数,然后返回这个o

然后定义个函数吧.

1 function class:ctor()
2     self.data=1
3 end
这里class:ctor()等于class.ctor(self)  ,self==class,说是表class.data=1。虽然看起来像是一个类的方法定义,但其实只是一个表的元素赋值。但是只是现在目前self是class表,后面可能不同了。

然后我们执行  a=class:new()就创建出了一个a对象。这个对象里面目前没有c++对象的函数表,也没有成员。就是一个空表,挂了一个metatable成员。这句代码分解开就是
function class:new()
    local o= {}
    setmetatable(o,class)
    class.__index=class
    o:ctor()
        --因为o是空表,所以只能去元表里找ctor这个函数,所以执行的效果如下面代码
    return o
end

function class.ctor(o)
    o.data=1
end
    

现在a={data=1,metatable=class},于是对象就实例化出来了。

有个成员data,但是函数还是在class中,调用函数就到class里找,不同的就是那个self==o,于是看起来这就是个对象了。

以此类推,给class添加函数就是给o“添加函数”,ctor里self增加成员就是给o添加成员。

时间: 2024-09-30 15:52:04

lua面向对象学习随笔 --类与实例的相关文章

面向对象学习【类-匿名类】

匿名类是就就像这个词一样,是一个没有名字的类,看到这个匿名类有点迷糊了,如果大家想想一个类没有名称的话那么我们如何来使用他创建实例呢?答案就是我们可以使用 var 来声明一个匿名的类,创建的格式为: new anonymousClassName{字段1,字段2,........} 说明: 匿名类当中的字段都全部都是public类型的,这就意味着我们可以在外部随意有访问这个所谓的匿名类: 看着这么爽其实这个匿名类还有很多的限制如: 1.使用匿名类时,必须对其初始化: 2.只能包含public字段;

面向对象学习【类-静态类】

静态类只能包含静态成员(使用该类创建的所有对象将共享这些成员的同一个副本).静态类纯粹作为工具方法和字段的一个容器来使用.静态类不能包含任何实例数据或方法.另外,使用new操作符来创建静态类的一个对象是没有意义的.如果坚持这样做,编译器会报错.如果需要执行任何初始化,那么static类可以包含一个默认的构造器,前提是该构造器也被声明为static.其他任何类型的构造器都是非法的,编译器会报错: 比如自己定义一个Math类,其中只包含静态成员,那么应该像下面这样写: public static c

附录A培训实习生-面向对象基础(1):类和实例

对象是一个自包含的实体,用一组可识别的特性和行为来标识. 面向对象编程,Object-Oriented Programming,其实就是针对对象进行编程的意思. 类就是具有相同属性和功能的对象的抽象的集合. 在编程过程中注意: 第一,类名称首字母记着要大写.多个单词则各个首字母大写. 第二,对外公开的方法需要用public修饰符. 实例,就是一个真实的对象. 实例化就是创建对象的过程,使用new关键字来创建. 下面是一个例子: 这是一个类, 1 using System; 2 using Sys

Delphi面向对象学习随笔九:后记

作者:巴哈姆特http://www.cnpack.org(转载时请注明出处并保持完整) 最后一篇了,呵呵!其实通过写这几篇笔记,也发现了我自己知识欠缺的部分.当然也通过各位高手的提点,让我把以前学习过的东西来了一次“体检”.    当然,错误也有,但是改了就还是好同志嘛,呵呵^_^ 随便介绍一下Delphi中的几个比较常用的类吧: TObject:    VCL中所有类的根类,即是说:VCL中所有的类/组件/控件都是从TObject中继承而来.TObject类中定义了基本的构造方法和析构方法.

Python -- 面向对象编程、类和实例、访问限制

面向对象编程 Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之

Python学习_11_类和实例

类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:? ? pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的语言使用new关键字有所不同: my_obj = MyClass() 一般来说,类名以大写字母开头,而对象名则以小写字母或者下划线开头. 实例化对象时,会执行类定义中的__init__()方法,该方法执行时包含实例的各种初始化操作. 方法和函数的区别:方法由对象调用,在方法定义中,第一个参数必须是显

面向对象高级编程——类、实例及其他对象的内建函数

内建函数 描      述 issubclass(sub,sup) 如果类sub是类sub的子类,则返回True,反之为False isinstance(obj1,obj2) 如果实例obj是类obj2或者obj2子类的一个实例,则返回True,反之为False hasattr(obj,attr) 如果obj有属性attr,则返回True getattr(obj,arrt[,default]) 返回对象obj的arrt属性,如果不存在,可以设置一个默认值,否则报错 setattr(obj,att

Delphi面向对象学习随笔五:一个真正的类

作者:巴哈姆特(转载请注明出去并保持完整)写在前面的话:    本篇笔记完全属于我的个人主观观点,如有错误请指正^_^  类的定义:    首先,我想说的是,类并不是一些变量和函数简单的“拼凑”出来的.类应该是对于一个事物的抽象描述,而不是一个动作的抽象描述.怎么讲呢?    比如说:鞋子是一个事物,我们可以把它的特点抽象出来,并用计算机语言去描述成为一个类,而鞋子又分了凉鞋.皮鞋等,那么“凉鞋”和“皮鞋”则是“鞋子”的派生类.它们看上去是非常自然的.    那么,现在我有另外一个类,“初始化数

Delphi面向对象学习随笔二 编写第一个类

作者:巴哈姆特(转载请注明出处并保持完整) 这回,我们讨论怎么编写我们自己的第一个类.    在编写我们自己的类之前,首先要说的是“类的继承”.    记得前几天,我在和一个朋友讨论类的特点的时候,他说:“类是可以没有构造方法的!”其实类必须有至少一个构造方法的,但是他的话也不全错,可以理解成“我们可以不实现我们自己的构造方法”.    当我们没有显式的为类编写一个构造方法的时候,那么,看上去,这个类好象是没有构造方法,但是实际上,就算你没有为这个类编写一个属于你自己的构造方法的时候,该类还是有