在C#中,如果定义了一个Person类,可以直接申明Person类型的变量。
但在lua中,没有类一说,能用到的就是表,可以通过元表的形式实现类的形式。先上代码:
1.类的对象的声明:
Person={name="",age=0}
function Person:showinfo()
print(self.name,self.age)
end
function Person:new(o)
local t=o or{}
setmetatable(t,{__index=Person})
return t
end
p1=Person:new()
p1:showinfo()
可以将Person表作为新建表的元表。Person:new()相当于一个构造函数,因为在lua中本质上类就是表。这样的话,既可以继承Person中的所有属性,又可以在不破坏Person的前提下,对里边的属性重新赋值。
注意此处对方法的申明用的是冒号:。这样做好处在于可以通过self参数直接访问表中的属性,如果用点.,就需要将表作为参数进行赋值。
2.类的继承:
比如上述中定义了Person类,而Person又可以往下延申为Student类和Teacher类,Student中有Person所有的属性,也包括新的年级属性。这就达到了继承的作用。此处最重要的一步在于使用Student:new()来实现继承。代码如下:
Student=Person:new()
Student.grade=1
stu1=Student:new()
stu1.name="erxiao"
stu1:showinfo()
Student:new()中,实际上Student并没有new方法,它会找它的元表中的new方法。最终实现的继承就是Student是stu1的元表,Person是Student的元表。属性之间的继承就可以实现了。