1.Lua如何实现面向对象的三大特性

  1. 1.Lua如何实现面向对象的三大特性
    1. 1.1 题目
    2. 1.2 深入解析
    3. 1.3 答题示例
    4. 1.4 关键词联想
      1. OOP 三大特性
      2. 实现机制
      3. 使用方式

1.Lua如何实现面向对象的三大特性


1.1 题目

Lua如何实现面向对象的三大特性?


1.2 深入解析

在 Lua 中,面向对象的三大特性可以通过以下方式实现:

  1. 封装
    • 封装可以通过 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())
  1. 继承
    • 继承可以通过元表(metatables)和 __index 元方法来模拟。我们可以将子类的元表设置为父类,然后将父类的 __index 指向父类自身。这样,当子类对象找不到对应的属性或方法时,就会去父类中查找,从而实现继承关系。
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
  1. 多态
    • 多态在 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 通过 tablemetatable 模拟面向对象的三大特性:

  • 封装:使用 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

×

喜欢就点赞,疼爱就打赏