在Lua中实现继承

 最近做的一个项目用到了Lua,所以也顺便学习了些,想必玩过魔兽的朋友都听说过lua,不过相对来说用这个的还是不多。

  面向对象只是一种思想,在Lua我们也可以实现,减少了冗余代码。

  先建一个类 person

  person={

    name="a",

    age = 23,

    high=177,

    weight=65

}

 

在pserson表里,我们定义了一个人所具有的所有属性,当然我们还可以有动作(方法),比如人给人加一个说话的动作,可以这样写:

   functiuon person:say()

      print(self.name.."我来了,哈哈")

   end

或者

  person.say= function(self)

  print(self.name.."我来了,哈哈")

  end

上边的两方法可以说是一样的只是命名方法不一样而已,相当于都是表person增加个说话的方法,唯一不同的是,可以看书,两个方法一个要带参数,一个不用,在这就运用到了Lua的语法糖语法 “:”,这个“:”相当于你在调用方法的时候把self自己给传进去了,比如:

调用 person:say()  和person.say(person)

  >>输出   a我来了,哈哈

相信对于这个语法大家已经明白了,我们继续继承

 

 

现在person的原型已经出来了,既然是面向对象,我们就要得有初始的构造方法啊,ok,下面我们就先写个person的构造方法

 

先看代码:

 

  function person:new(o)
    --private 成员区域
    o = o or {}
    setmetatable(o,self)
    self.__index = self
    return o
end

 

ok构造方法完成,在这里需要解释下 元表的意思了,lua中任何一张表都有其元表,一组相关的表可以共享一个元表(也就是说可以共享元表的属性了),默认的是创建一个不带元表的表。在这里我们使用setmetatable(o,self),(lua的方法setmetatable)这个方法的意思就是,表o的元表是self,self  -前面说过,就是谁调用new()self就是谁,在这里就是person,我们理一下,在这个方法里:o是一个传进来的表table,他的元表是person,如此只要你给这个方法传一个值(最好是一个表table),我们都会给你返回一个以person为元表的table表了,如此一来,你只要new一下我们都会造一个person对象了

 

 

 

当然,我们还想要继承,我们怎样做:

给person加一个方法,

person.extend=person.new

呵呵,简单吧,其实就是person的new()方法我们变个名字而已,比如:

C=person:extend()

就代笔C继承了person,拥有了person所拥有的属性,

你可以试试:

C:say()

>>输出:a我来了,哈哈

 

当然我们还可以扩展子类C自己的属性和方法,我们只需

C=person:extend({hand="two",go=function() print(self.name.."__gpgpgp") end})

调用C:go()

>>输出:a__gpgpgp

调用print(C.name)

>>输出:a

 

Lua ,可以使用基于原型的继承方式来实现继承基类。具体步骤如下: 1. 定义一个基类,可以是一个普通的 Lua 表,也可以是一个包含方法的 Lua 类。 2. 定义一个继承函数,该函数接受一个子类表和父类表作为参数,实现继承的过程。 3. 在子类表添加一个 __index 元方法,让 Lua 在查找子类表不存在的元素时,自动去父类表查找。 4. 在子类表添加一个 new 函数,用于创建子类的实例。 例如,假设我们有一个基类 Animal: ```lua local Animal = { name = "unknown", age = 0 } function Animal:new(name, age) o = {} setmetatable(o, self) self.__index = self self.name = name self.age = age return o end function Animal:say() print("I am an animal.") end ``` 现在我们想要继承 Animal 类,可以定义一个子类 Dog: ```lua local Dog = {} function Dog:new(name, age, breed) o = Animal:new(name, age) setmetatable(o, self) self.__index = self self.breed = breed return o end function Dog:bark() print("Woof!") end ``` 在子类 Dog ,我们调用了 Animal 类的 new 函数来初始化子类实例,然后设置了子类的元表为自身,添加了一个 __index 元方法,让 Lua 在查找子类表不存在的元素时,自动去父类表查找。最后,我们在子类定义了一个新的方法 bark。 现在,我们就可以创建 Dog 类实例,并调用父类和子类的方法了: ```lua local myDog = Dog:new("Buddy", 2, "Golden Retriever") myDog:say() -- output: I am an animal. myDog:bark() -- output: Woof! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值