1.Lua如何实现面向对象的三大特性
1.1 题目
Lua如何实现面向对象的三大特性?
1.2 深入解析
在 Lua 中,面向对象的三大特性可以通过以下方式实现:
- 封装:
- 封装可以通过 table 进行实现。在 Lua 中,我们可以将对象的属性和方法放入一个 table 中,然后对该 table 进行操作,从而达到封装的效果。
Object = {}
setmetatable(Object, Object)
Object.__index = Object
function Object:new()
local obj = {}
setmetatable(obj, self)
self.__index = self
return obj
end
function Object:toString()
return tostring(self)
end
object1 = Object:new()
print(object1:toString())
- 继承:
- 继承可以通过元表(metatables)和
__index
元方法来模拟。我们可以将子类的元表设置为父类,然后将父类的__index
指向父类自身。这样,当子类对象找不到对应的属性或方法时,就会去父类中查找,从而实现继承关系。
- 继承可以通过元表(metatables)和
function Object:subClass(className)
_G[className] = {}
_G[className].base = self
setmetatable(_G[className], self)
self.__index = self
end
Object:subClass("Animal")
function Animal:new(animalName)
local obj = Animal.base.new(self)
obj.animalName = animalName
return obj
end
function Animal:Speak()
print("动物"..self.animalName.."开始叫")
end
- 多态:
- 多态在 Lua 中可以通过子类自己实现同名方法并且使用冒号
:
来调用。当调用同名方法时,Lua 会根据对象的类型来决定调用哪个方法,从而实现多态的效果。
- 多态在 Lua 中可以通过子类自己实现同名方法并且使用冒号
Animal:subClass("Dog")
function Dog:Speak()
self.base.Speak(self)
print("狗"..self.animalName.."开始旺旺叫")
end
dog1 = Dog:new("Spike")
dog1:Speak()
Animal:subClass("Cat")
function Cat:Speak()
self.base.Speak(self)
print("猫"..self.animalName.."开始喵喵叫")
end
cat1 = Cat:new("Tom")
cat1:Speak()
1.3 答题示例
Lua 通过 table
和 metatable
模拟面向对象的三大特性:
封装:使用
table
封装属性与行为,通常定义一个通用的Object
基类,提供new()
实例化方法,并设置元表__index
指向自身,用于访问属性和方法。继承:通过设置元表实现继承关系,子类通过调用基类的
subClass("子类名")
方法,在_G
(大 G 表)中动态注册类,继承父类属性与方法。多态:子类通过
:
重写父类同名方法,调用时根据实际对象类型动态派发,达到多态行为。
虽然 Lua 本身不支持面向对象,但借助 table
、元表和 _G
的机制,也能完整实现类、继承和多态的结构与行为。
1.4 关键词联想
OOP 三大特性
- 封装 / 继承 / 多态
- 基类 Object / 子类扩展
实现机制
table
表结构metatable
元表机制__index
属性查找链_G
全局环境(大 G 表):
方法调用语法糖(self 传参)
使用方式
Object:new()
实例化Object:subClass("类名")
注册子类- 子类重写父类方法以实现多态
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com