Lua如何实现面向对象

1.面向对象的三大特征

(1)封装

        封装是指将数据(属性)和行为(方法)封装在一个对象中,并对外部隐藏对象的具体实现细节,只提供有限的接口与外部交互。这种机制提供了对外部访问的限制和保护,使得对象的使用者无需关心对象内部的实现细节,只需关注对象提供的公共接口。封装有助于提高代码的可维护性、可重用性和安全性。

(2)继承

        继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而可以扩展或修改父类的功能。这种机制能够建立类之间的层次关系,使得代码可以更好地重用和扩展,同时提高了代码的可扩展性和可维护性。子类可以重用父类的代码,还可以根据需要添加新的属性和方法。

(3)多态

        多态是指同一个方法在不同情况下表现出不同的行为。它允许不同的对象对同一消息做出不同的响应。多态性使得程序可以处理不同类型的对象,而无需依赖具体对象的类型,从而实现了代码的灵活性和可扩展性。多态性可以通过继承和接口实现,使得代码更具通用性和可复用性。

2.Lua实现面向对象的原理

(1)表作为对象:在 Lua 中,可以使用表(table)作为对象的基础。每个表可以存储数据和函数,表中的函数可以视为对象的方法。

(2)元表与元方法:通过元表,Lua 允许对表进行操作的行为自定义。元方法如__index 和__newindex可以用来实现属性访问和修改的自定义行为,从而模拟继承和封装等面向对象的特征。

(3)继承模拟:通过设置 __index 元方法,Lua 可以实现表的继承。子类表可以通过 __index指向父类表,从而访问父类中的属性和方法。

(4)构造函数和实例化:可以创建一个表作为类,并定义一个构造函数(通常是一个表的函数),用于初始化新对象。这个构造函数通常会返回一个新创建的表实例。

通过这些机制,Lua 可以模拟面向对象的编程特性,尽管它没有内建的类和对象结构。

3.Lua实现封装

代码部分:

测试结果输出:

4.Lua实现继承

代码部分:

测试结果输出:

5.Lua实现多态

代码部分:

测试结果输出:

6.Lua实现面向对象的完整代码(项目可直接使用)

--面向对象实现
--万物之父 所有对象的基类 Object
--封装
Object = {}
--实例化方法
function Object:new()
    local obj = {}
    --给空对象设置元表 以及__index
    self.__index = self
    setmetatable(obj,self)
    return obj
end
--继承
function Object:subClass(className)
    --根据名字生成一张表 就是一个类
    _G[className] = {}
    local obj = _G[className]
    --设置自己的“父类”
    obj.base = self
    --给子类设置元表 以及__index
    self.__index = self
    setmetatable(obj,self)
end

--申明一新的类
Object:subClass("GameObject")
--成员变量
GameObject.posX = 0
GameObject.posY = 0
--成员方法
function GameObject:Move()
    self.posX = self.posX + 1
    self.posY = self.posY + 1
end

--实例化对象使用
local obj = GameObject:new()
print(obj.posX)
obj:Move()
print(obj.posX)

local obj = GameObject:new()
print(obj.posX)
obj:Move()
print(obj.posX)

--申明一个新的类 Player 继承 GameObject
GameObject:subClass("Player")
--多态 重写了 GameObject的Move方法
function Player:Move()
    --base调用父类方法 用.自己传第一个参数
    self.base.Move(self)
end
print("**************")
--实例化Player对象
local player1 = Player:new()
print(player1.posX)
player1:Move()
print(player1.posX)

local player2 = Player:new()
print(player2.posX)
player2:Move()
print(player2.posX)

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua是一种脚本语言,它支持面向对象编程。在Lua中,我们可以通过表(table)来实现面向对象编程。表可以被看作是一个对象,它可以存储任意类型的数据(包括函数),还可以作为其他表的元素。下面是使用Lua实现面向对象的一些基本步骤: 1. 创建一个表,它代表一个类 2. 在这个表中定义一个构造函数,用于创建该类的实例 3. 在这个表中定义其他成员函数和成员变量 4. 在这个表中定义一个元表,用于实现继承和多态 下面是一个简单的例子,展示了如何使用Lua实现一个名为Person的类: ```lua -- 创建一个Person类 Person = {} -- 定义Person的构造函数 function Person:new(name, age) local obj = {} obj.name = name obj.age = age setmetatable(obj, self) self.__index = self return obj end -- 定义Person的成员函数 function Person:sayHello() print("Hello, my name is " .. self.name .. ", I'm " .. self.age .. " years old.") end -- 创建一个Person对象 local person = Person:new("Tom", 20) -- 调用对象的成员函数 person:sayHello() ``` 在这个例子中,我们首先创建了一个空表Person,它代表一个类。然后我们定义了Person的构造函数new,用于创建Person的实例。在构造函数中,我们创建了一个新表obj,并将name和age属性赋值给它。然后我们使用setmetatable函数将obj的元表设置为Person,并将self设置为__index。这样做可以让obj继承Person的成员函数。最后,我们返回obj。 接下来,我们定义了Person的成员函数sayHello,它用于打印出人的姓名和年龄。在最后,我们创建了一个Person对象person,并调用它的成员函数sayHello。 如果你想要继承Person类,你可以创建一个新的表Student,并将它的元表设置为Person。这样做可以让Student继承Person的成员函数和属性。如果你想要重写某个成员函数或属性,你可以直接在Student表中重新定义它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值