LuaForUnity7:Lua“类与对象”

前文:https://blog.csdn.net/Jaihk662/article/details/95452907(Lua表与元表)

一、Lua的“面对对象”

可以看到题目和标题的“类与对象”都是加了引号的,原因很简单:

Lua语言本质上是非常简单的,没有强大的类库,所以说使用Lua独立开发一款程序是不可能的,大部分情况都是是嵌入到其他语言编写的程序中进行辅助工作,这句话的意思就是:其实Lua根本就没有类与对象的概念

而Lua所谓的“面对对象”其实是根据table模拟出来的一个环境,所以和一般语言的类与对象还是有差,那么究竟是怎么模拟的呢?可以参考下面这份最简单的代码:

print("--------------------------------------------------------------------")
t1 = {1,2,3}
t2 = {1,2,3}
t3 = t1
print(t2 == t1)   --false
print(t3 == t1)   --true
t3[3] = 5
print(t1[3])      --5,可以发现table是引用型的

print("--------------------------------------------------------------------")
Person = {name, age}        --定义一个Person类,其中name和age都为“字段”,注意这里的name没有加双引号,所以当然不是字符串

function Person:New(name)   --模拟构造函数
    local obj = {}                --初始化一个新表
    setmetatable(obj, Person)
    Person.__index = Person         --设置元表并指定索引
    obj.name = name
    return obj
end

function Person:Show()      --模拟一个方法
    print(string.format("名字:%s, 年龄:%d", self.name, self.age))
    --self表示当前"类"的对象,和C#中的this类似
end

you = Person:New("Huangkai")
you.age = 250
me = Person:New("Jia")
me.age = 10
you:Show()
me:Show()
print(Person)

print("--------------------------------------------------------------------")

可以从代码中得出:

  • table本质是引用型
  • 构造函数的实现利用了元表
  • 方法=函数,字段=value

二、类的继承

例子如下:

Person = {name = "", age = 0}

--语法糖:计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用
--function Person:New(name, age)         定义函数的两种方法,和下面起到的效果完全一样,其中":"是一种语法糖,同等于调用方法的时候把self自己传进去
Person.New = function(self, name, age)
    local obj = {
        name = name,
        age = age
    }
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function Person:Show()
    print(string.format("名字:%s, 年龄:%d", self.name, self.age))
    --self表示当前"类"的对象,和C#中的this类似
end

--Humen为子类
Humen = Person:New()    --可以不传参数,默认为nil
function Humen:New(name, age, sex)        --重写父类构造函数
    local obj = {
        name = name,
        age = age,
        sex = sex
    }
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function Humen:SonShow()      --子类方法
    print(string.format("名字:%s, 年龄:%d,性别:%s", self.name, self.age, self.sex))
    --self表示当前"类"的对象,和C#中的this类似
end

you = Person:New("Huangkai", 250)
you:Show()

me = Humen:New("Jia", 15, "boy")
me:SonShow()
me:Show()
原创文章 1134 获赞 1439 访问量 61万+

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/95640417