您当前的位置: 首页 > 
  • 3浏览

    0关注

    193博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Lua实现类及面向对象

我寄人间雪满头丶 发布时间:2021-06-14 20:43:28 ,浏览量:3

准备

了解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用法这里面有介绍 菜鸟教程

关注
打赏
1648518768
查看更多评论
立即登录/注册

微信扫码登录

0.1585s