hand
_1_34_47
4
返回栏目
1k
2k
1k
2k
1k
1k
2k
2k
2k
2k
2k
2k
3k
3k
2k
2k
2k
1k
2k
2k
2k
2k
2k
2k
2k
2k
1k
1k
1k
2k
1k
1k
2k
1k
2k
2k
2k
2k
2k
2k
2k
1k
2k
2k
2k
2k
2k
3k
2k
2k
6k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
2k
2k
2k
3k
3k
3k
1k
3k
3k
5k
2k
2k
2k
1k
1k
2k
2k
1k
1k
1k
2k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
2k
2k
3k
3k
2k
2k
2k
2k
4k
2k
3k
2k
3k
2k
3k
2k
3k
2k
2k
2k
3k
返回Lua栏目
作者:
贺及楼
成为作者
更新日期:2025-02-27 21:53:57
在 Lua 这种灵活的脚本语言中,虽然没有像传统面向对象语言(如 Java、C++)那样内置的类和继承机制,但我们可以通过表(table)和元表(metatable)来模拟类和继承的行为。在继承的基础上,方法重写(子类覆盖父类方法)是一个非常重要的特性,它允许子类对父类的方法进行定制,以满足自身特定的需求。
在 Lua 中,我们可以使用表来表示类,每个表可以看作是一个对象,通过元表可以实现继承。当访问一个对象的某个字段或方法时,Lua 会首先在对象本身的表中查找,如果找不到,就会通过元表的 __index
元方法到父类的表中查找。
-- 定义一个基类
local BaseClass = {}
-- 基类的构造函数
function BaseClass:new()
local obj = {}
setmetatable(obj, self)
self.__index = self
return obj
end
-- 基类的方法
function BaseClass:sayHello()
print("Hello from BaseClass!")
end
-- 创建一个基类的实例
local baseObj = BaseClass:new()
baseObj:sayHello() -- 输出: Hello from BaseClass!
在上述代码中,我们定义了一个基类 BaseClass
,并为其实现了一个构造函数 new
,通过 setmetatable
和 __index
元方法实现了基本的类和对象的机制。最后创建了一个基类的实例 baseObj
并调用了其 sayHello
方法。
接下来,我们要创建一个子类,让它继承自 BaseClass
。
-- 定义一个子类
local SubClass = BaseClass:new()
-- 子类的构造函数
function SubClass:new()
local obj = BaseClass:new()
setmetatable(obj, self)
self.__index = self
return obj
end
-- 创建一个子类的实例
local subObj = SubClass:new()
subObj:sayHello() -- 输出: Hello from BaseClass!
在这段代码中,我们定义了一个子类 SubClass
,它继承自 BaseClass
。子类的构造函数先调用父类的构造函数创建一个对象,然后再设置自己的元表和 __index
元方法。当我们创建子类的实例 subObj
并调用 sayHello
方法时,由于子类没有重写该方法,所以会调用父类的 sayHello
方法。
方法重写允许子类提供自己的实现来覆盖父类的方法。当调用被重写的方法时,会优先调用子类的实现。
-- 重写子类的 sayHello 方法
function SubClass:sayHello()
print("Hello from SubClass!")
end
-- 再次调用子类实例的 sayHello 方法
subObj:sayHello() -- 输出: Hello from SubClass!
在上述代码中,我们在子类 SubClass
中重写了 sayHello
方法。当再次调用子类实例 subObj
的 sayHello
方法时,会输出子类自己的信息,说明子类的方法覆盖了父类的方法。
有时候,我们可能需要在子类的重写方法中调用父类的方法,然后再添加一些额外的逻辑。
-- 重写子类的 sayHello 方法,并调用父类的方法
function SubClass:sayHello()
BaseClass.sayHello(self) -- 调用父类的方法
print("Additional message from SubClass!")
end
-- 再次调用子类实例的 sayHello 方法
subObj:sayHello()
-- 输出:
-- Hello from BaseClass!
-- 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 也能像传统面向对象语言一样实现灵活的代码复用和定制。
Lua
整章节共127节
快分享给你的小伙伴吧 ~