• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

关闭

返回栏目

关闭

返回Lua栏目

47 - 继承 - 方法重写 - 子类覆盖父类方法

作者:

贺及楼

成为作者

更新日期:2025-02-27 21:53:57

Lua 《继承 - 方法重写 - 子类覆盖父类方法》

在 Lua 这种灵活的脚本语言中,虽然没有像传统面向对象语言(如 Java、C++)那样内置的类和继承机制,但我们可以通过表(table)和元表(metatable)来模拟类和继承的行为。在继承的基础上,方法重写(子类覆盖父类方法)是一个非常重要的特性,它允许子类对父类的方法进行定制,以满足自身特定的需求。

1. Lua 中实现类和继承的基本原理

在 Lua 中,我们可以使用表来表示类,每个表可以看作是一个对象,通过元表可以实现继承。当访问一个对象的某个字段或方法时,Lua 会首先在对象本身的表中查找,如果找不到,就会通过元表的 __index 元方法到父类的表中查找。

示例代码

  1. -- 定义一个基类
  2. local BaseClass = {}
  3. -- 基类的构造函数
  4. function BaseClass:new()
  5. local obj = {}
  6. setmetatable(obj, self)
  7. self.__index = self
  8. return obj
  9. end
  10. -- 基类的方法
  11. function BaseClass:sayHello()
  12. print("Hello from BaseClass!")
  13. end
  14. -- 创建一个基类的实例
  15. local baseObj = BaseClass:new()
  16. baseObj:sayHello() -- 输出: Hello from BaseClass!

在上述代码中,我们定义了一个基类 BaseClass,并为其实现了一个构造函数 new,通过 setmetatable__index 元方法实现了基本的类和对象的机制。最后创建了一个基类的实例 baseObj 并调用了其 sayHello 方法。

2. 实现继承

接下来,我们要创建一个子类,让它继承自 BaseClass

示例代码

  1. -- 定义一个子类
  2. local SubClass = BaseClass:new()
  3. -- 子类的构造函数
  4. function SubClass:new()
  5. local obj = BaseClass:new()
  6. setmetatable(obj, self)
  7. self.__index = self
  8. return obj
  9. end
  10. -- 创建一个子类的实例
  11. local subObj = SubClass:new()
  12. subObj:sayHello() -- 输出: Hello from BaseClass!

在这段代码中,我们定义了一个子类 SubClass,它继承自 BaseClass。子类的构造函数先调用父类的构造函数创建一个对象,然后再设置自己的元表和 __index 元方法。当我们创建子类的实例 subObj 并调用 sayHello 方法时,由于子类没有重写该方法,所以会调用父类的 sayHello 方法。

3. 方法重写(子类覆盖父类方法)

方法重写允许子类提供自己的实现来覆盖父类的方法。当调用被重写的方法时,会优先调用子类的实现。

示例代码

  1. -- 重写子类的 sayHello 方法
  2. function SubClass:sayHello()
  3. print("Hello from SubClass!")
  4. end
  5. -- 再次调用子类实例的 sayHello 方法
  6. subObj:sayHello() -- 输出: Hello from SubClass!

在上述代码中,我们在子类 SubClass 中重写了 sayHello 方法。当再次调用子类实例 subObjsayHello 方法时,会输出子类自己的信息,说明子类的方法覆盖了父类的方法。

4. 在子类方法中调用父类方法

有时候,我们可能需要在子类的重写方法中调用父类的方法,然后再添加一些额外的逻辑。

示例代码

  1. -- 重写子类的 sayHello 方法,并调用父类的方法
  2. function SubClass:sayHello()
  3. BaseClass.sayHello(self) -- 调用父类的方法
  4. print("Additional message from SubClass!")
  5. end
  6. -- 再次调用子类实例的 sayHello 方法
  7. subObj:sayHello()
  8. -- 输出:
  9. -- Hello from BaseClass!
  10. -- Additional message from SubClass!

在这段代码中,我们在子类的 sayHello 方法中先调用了父类的 sayHello 方法,然后再输出一条额外的信息。

总结

概念 描述 示例代码
基类 定义基本的类和方法 local BaseClass = {}; function BaseClass:sayHello() print("Hello from BaseClass!") end
子类继承 子类继承父类的方法和属性 local SubClass = BaseClass:new(); function SubClass:new() local obj = BaseClass:new(); setmetatable(obj, self); self.__index = self; return obj end
方法重写 子类提供自己的方法实现覆盖父类的方法 function SubClass:sayHello() print("Hello from SubClass!") end
调用父类方法 在子类方法中调用父类的方法 function SubClass:sayHello() BaseClass.sayHello(self); print("Additional message from SubClass!") end

通过以上的示例和解释,我们可以看到在 Lua 中如何通过表和元表实现类和继承,以及如何进行方法重写。这种机制让 Lua 也能像传统面向对象语言一样实现灵活的代码复用和定制。