lua的伪面向对象和继承理解

关于 setmetable 和index的理解的博文
http://blog.csdn.net/wisdom605768292/article/details/36662033

总结:
**1.在表中查找,如果找到,返回该元素,找不到则继续

2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续

3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值**

local Account = { balance = 10,count = 100}

function Account:new( tab)

    print(" [new] tab : ",tab)
    print(" [new] self : ",self)
    print(" [new] Account: ",Account)

    setmetatable(tab,self)
    self.__index = self
     return tab
end

function Account:add(v)
    print(" [add] self : ",self)
    self.count = self.count + v
    print(" count  = " .. self.count)
end

local t = Account:new({ count = 30})

t:add(10)


local  s = Account:new({ ss= 3})
s:add(30)

print(Account.count)
print(s.count)

基类 是account类, t类和s类分别继承

new操作:
基类有count数据
t类赋初始值 来初始化,而s类采用基类的默认初始化

看似是继承实际上也可以理解为将Account实例类 具体化为t和s两个不同的对象类型。
如下c++代码

class Account
{
public:
   Account()
   {  count =0;}
   Account(int count)
   {  this->count = count;}
public:
   int count ;
   int balance; 
}

Account t = new account(30);
Account s = new Account();

且t和s两个对象的数据是不共享的

add方法:
在lua中的t和s中找不到add,然后找account里面的add
但是self还是t和s本身不是Account,因为是通过
t:add 和s:add调用的

通过上段的lua代码的结果也可以印证

 [new] tab :    table: 009E9440
 [new] self :   table: 009E9210
 [new] Account:     table: 009E9210
 [add] self :   table: 009E9440
 count  = 40
 [new] tab :    table: 009E9198
 [new] self :   table: 009E9210
 [new] Account:     table: 009E9210
 [add] self :   table: 009E9198
 count  = 130
100
130
[Finished in 0.2s]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua是一种脚本语言,它支持面向对象编程。在Lua中,我们可以通过表(table)来实现面向对象编程。表可以被看作是一个对象,它可以存储任意类型的数据(包括函数),还可以作为其他表的元素。下面是使用Lua实现面向对象的一些基本步骤: 1. 创建一个表,它代表一个类 2. 在这个表中定义一个构造函数,用于创建该类的实例 3. 在这个表中定义其他成员函数和成员变量 4. 在这个表中定义一个元表,用于实现继承和多态 下面是一个简单的例子,展示了如何使用Lua实现一个名为Person的类: ```lua -- 创建一个Person类 Person = {} -- 定义Person的构造函数 function Person:new(name, age) local obj = {} obj.name = name obj.age = age setmetatable(obj, self) self.__index = self return obj end -- 定义Person的成员函数 function Person:sayHello() print("Hello, my name is " .. self.name .. ", I'm " .. self.age .. " years old.") end -- 创建一个Person对象 local person = Person:new("Tom", 20) -- 调用对象的成员函数 person:sayHello() ``` 在这个例子中,我们首先创建了一个空表Person,它代表一个类。然后我们定义了Person的构造函数new,用于创建Person的实例。在构造函数中,我们创建了一个新表obj,并将name和age属性赋值给它。然后我们使用setmetatable函数将obj的元表设置为Person,并将self设置为__index。这样做可以让obj继承Person的成员函数。最后,我们返回obj。 接下来,我们定义了Person的成员函数sayHello,它用于打印出人的姓名和年龄。在最后,我们创建了一个Person对象person,并调用它的成员函数sayHello。 如果你想要继承Person类,你可以创建一个新的表Student,并将它的元表设置为Person。这样做可以让Student继承Person的成员函数和属性。如果你想要重写某个成员函数或属性,你可以直接在Student表中重新定义它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值