准备

了解Lua语言
了解table

面向对象

1.类

Lua语言本身是没有“类和对象”的概念的。
table是引用型数据。
使用 Lua 语言本身的 table模拟出类和对象的关系。由于是模拟出来的,所以和在C#中学习过的面向对象还是有很大的不同。
C#语言当中类最基本的组成成员是“字段”和“方法”。下面演示模拟创建一个Person类。

知识点分析:
①类:就是初始化一个 table;
②类中的字段:在 table 的{ }内进行定于,可以指定初始化值;
③类中的方法:就是普通函数的语法格式,方法名的语法格式是“类名:方法名”;
④self 关键字:作用类似于 C#中的 this,指的是当前类(表)。(要注意:函数才有self,.没有)

--初始化一个类
Person = {name,age,gender,address = "China"}

--模拟一个方法
function Person:Show()
    print(self.name,self.age,self.gender,self.address)
end

2.类的实例化

C#语言中,我们是通过构造方法进行类的实例化的。在 Lua 语言中,我们也需要模拟一个构造方法,并通过元表的方式,创建类的实例对象。
这里主要用到的就是前面学的的“元表”。

--模拟构造方法
--这样的话声明新的类(表)用的就是新的内存地址
function Person:New()
    obj = {} --初始化一个新表
    setmetatable(obj,Person) --将当前的类(表)设置为新表的元表
    Person.__index = Person --指定元表的__Index索引
    return obj
end

我们也可以在构造函数中直接将类初始化。
如果不是全局变量最好加上local关键字。

function Person:New(name,age,gender,address)
    local obj = {}
    setmetatable(obj,self)
    Person.__index = self
    self.name = name
	self.age = age
	self.gender = gender
	self.attack = attack
    return obj
end

3.对象基本使用

在 C#语言中我们是需要通过类来实例化一个对象的。但是在 Lua 语言中,我们也可以模拟出类似的关系。

知识点分析:
①访问对象中的字段:格式是“对象名.字段名”;
②访问对象中的方法:格式是“对象名:方法名”。

Test1 = Person:New()
Test1.name = "1";
Test1.age = "1";
Test1.gender = "1";
Test1:Show()

Test2 = Person:New()
Test2.name = "2";
Test2.age = "2";
Test2.gender = "2";
Test2:Show()

4.继承

在 C#语言的面向对象中,类与类之间是存在继承关系的。
子类继承父类,在子类中就可以访问到父类中的公开的字段和方法。
下面进行类继承关系的模拟和演示。

--创建一个动物类父类
Animal = {name} --字段.

--构造方法
function Animal:New(name)
	local obj = {}
	setmetatable(obj, self)
	self.__index = self
	self.name = name
	return obj
end

--普通方法.
function Animal:ToString()
	print(self.name .. "Animal类中的方法")
end

--子类继承父类.
Cat = Animal:New(nil)

--子类的构造方法.
function Cat:New(name)
	local obj = Animal:New(name)
	setmetatable(obj, self)
	self.__index = self
	--self.name = name --这句父类中有不用再写
	return obj
end

--子类当的普通方法.
function Cat:Eat(food)
	print(self.name .. "吃:" .. food)
end

--通过子类实例化对象.
tom = Cat:New("汤姆")
tom:ToString()
tom:Eat("杰瑞")
print(tom.name)

5.类与对象代码分离

C#语言的面向对象开发中,一个类一般是一个独立的脚本。这些独立的脚本存在于命名空间内,我们只需要引入对应的命名空间,就可以访问到这些类。
下面我们用Lua模拟 C#进行类和对象的分离。

语法格式:dofile("[路径]脚本名.lua")

路径
相对路径:就是相对于当前文件的一个路径位置。
注意事项:“…\”表示上一级目录。
绝对路径:就是我们电脑上的绝对地址,如“C:\aaa\bbb\ccc\ddd.lua”。
“路径”使用相对路径或者绝对路径都可以,这样我们就可以获取到其他Lua文件。一般都使用相对路径。

代码部分

dofile("D:\\U3D_Project\\Lua\\19\\Lua\\19\\class\\Animal.lua") --绝对路径
dofile("..\\class\\Person.lua") --相对路径

tom = Animal:New("汤姆")
tom:ToString()

mk = Person:New("mkcode", 88, '男', "北京海淀")
mk:ToString()

module函数用法require用法这里面有介绍菜鸟教程